ABAP 内表分组

在低版本的740语法中,对内表分组可以通过在循环中使用AT NEWon change of的语法来实现循环分组的逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT *
INTO TABLE @DATA(lt_sflight)
FROM sflight
UP TO 30 ROWS.


SORT lt_sflight BY carrid connid.

LOOP AT lt_sflight INTO DATA(lw_sflight).
WRITE : / lw_sflight-connid.
AT NEW connid.
WRITE : / 'AT NEW connid: ' , lw_sflight-connid.
ENDAT.
ENDLOOP.
  • 在使用AT NEW时要注意
    • 该语法以目标字段及其对应的前面的字段为基准来判定是否是NEW
    • AT...ENDAT代码段中,工作区除去基准字段外,其他字段会被置空
1
2
3
4
5
6
LOOP AT lt_sflight INTO lw_sflight.
WRITE : / lw_sflight-connid.
ON CHANGE OF lw_sflight-connid.
WRITE : / 'ON CHANGE OF connid: ' , lw_sflight-connid.
ENDON.
ENDLOOP.
  • 在使用ON CHAGE OF时要注意
    • 程序会隐式生成一个临时变量用于存储基准字段的值,是否CHANGE取决于隐式变量是否改变
    • 该隐式变量的生命周期>LOOP,因此如果在内表的头尾相同的情况下第二次开始的LOOP第一行不会触发ON CHAGE OF
    • 因此推荐在使用该语法前对内表进行排序

新版本的740语法中提供了另外一种循环分组的语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
"分组循环
LOOP AT lt_sflight INTO DATA(lw_sflight)
GROUP BY ( carrid = lw_sflight-carrid size = GROUP SIZE )
REFERENCE INTO DATA(lt_sflight_group)."每一组的对象

IF lt_sflight_group->*-size > 1."当前组有重复的carrid
"业务逻辑
LOOP AT GROUP lt_sflight_group INTO DATA(lw_sflight_group).
WRITE / lw_sflight_group-carrid.
EXIT.
ENDLOOP.
ENDIF.
ENDLOOP.

ABAP 内表分组
https://claudechan1228.github.io/2024/01/27/002-ABAP 内表分组/
作者
Claude Chan
发布于
2024年1月27日
许可协议