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