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.