由于大家对语法及其含义似乎有些混淆,让我们用一个非常简单的例子来逐步处理内部表的分组问题,你会发现其实并不复杂。我还附上了一个程序的全文,该程序会执行以下步骤并产生一些输出结果。
是的,您有一个内部表 spfli_tab TYPE TABLE OF spfli
,其中填充了来自数据库表 SPFLI
的数据(还有什么…)。
第 1步:按一列分组
最简单的方法就是按一列分组:
LOOP AT spfli_tab INTO waGROUP BY wa–carrid.… wa–carrid ...ENDLOOP.
在循环内部,我们可以访问 wa
,尤其是 wa-carrid
字段。wa
包含 GROUP BY 创建的每个组的第一行。这就是所谓 representative binding。在循环中,wa
代表一个分组。
要访问每个组的成员,需要添加一个成员循环:
LOOP AT spfli_tab INTO waGROUP BY wa-carrid.…LOOP AT GROUP wa INTO DATA(member).… member-… …ENDLOOP.…ENDLOOP.
member
是行类型为 spfli_tab
的结构体,包含每个组的成员。
第 2 步,按多列分组
如果要根据不止一个分组标准(最简单的情况是列)进行分组,可以这样写:
LOOP AT spfli_tab INTO waGROUP BY ( key1 = wa-carrid key2 = wa-airpfrom ).… wa-carrid … wa-airpfrom …ENDLOOP.
在这种情况下,你需要构建一个结构化 group key。在此处所示的代表绑定中,wa
被重复用于访问循环中的组密钥。
为了访问组中的成员,可以添加与上述步骤 1 完全相同的成员循环。
第 3 步:按一列分组的组键绑定
除了重复使用 LOOP AT 的 INTO 子句来访问组的代表绑定外,还可以定 group key binding:
LOOP AT spfli_tab INTO waGROUP BY wa-carridINTO DATA(key).… key …ENDLOOP.
和上面的步骤 1 没有太大区别吧?为了方便起见,这里使用了一个基本数据对象键,而不是重复使用 wa
。与代表绑定(additions WITHOUT MEMBERS
、GROUP SIZE
、GROUP INDEX
)相比,组键绑定提供了更多的功能。如果不需要这些功能,可以继续使用代表绑定。不过,我自己更喜欢组键绑定,因为它能使组键更明确。但这只是个人喜好的问题。
插入成员循环与之前一样:
LOOP AT spfli_tab INTO waGROUP BY WA-CARRIDINTO DATA(key).…LOOP AT GROUP key INTO member.… members …ENDLOOP.…ENDLOOP.
请注意,您现在可以使用变量名 key
访问组。
第 4 步,按一列以上分组的分组键绑定
最后重要的是,针对结构化组主键的 group key 绑定:
LOOP AT spfli_tab INTO waGROUP BY ( key1 = wa-carrid key2 = wa-airpfrom )INTO DATA(key).… key-key1 … key-key2 …ENDLOOP.
现在,key 是一个由 key1 和 key2 组成的结构。成员循环可以完全按第 3 步添加。
如果 members 不感兴趣,可以使用 “NO MEMBERS
”添加,以节省运行时间和内存。例如:
LOOP AT spfli_tab INTO waGROUP BY ( key1 = wa-carrid key2 = wa-airpfromindex = GROUP INDEX size = GROUP SIZE )WITHOUT MEMBERSINTO DATA(key).… key-key1 … key-key2 … key-index … key-size … ENDLOOP.
这里不可能有成员循环。但键值中加入了一些预定义的可选组件,以获取更多信息。
总结
不会太复杂吧?
了解了这些简单的事实后,你可以继续阅读文档,做一些更复杂的事情,例如,利用组键定义的 RHS 可以使用表达式这一事实,或者使用 FOR
表达式代替 LOOP AT
。