AT FIRST
AT FIRST.
代码块
ENDAT.
循环的第一条时执行代码块
AT LAST
AT LAST.
代码块
ENDAT.
循环的最后一条时执行代码块
AT NEW
AT NEW 字段.
代码块
ENDAT.
当该字段及其左边的任一字段发生改变时触发代码块,
即与上一行的相关字段有区别时触发代码块
第一行必定执行
AT END OF
AT END OF 字段.
代码块
ENDAT.
若该字段及其左边任一字段将要发生改变时触发代码块,
即与下一行的相关字段有区别就触发
最后一行必定触发
ON CHANGE OF
ON CHANGE OF 字段.
代码块
ENDON.
当该字段发生改变时触发代码块
该字段与上一行字段不同时触发
第一行必定触发
特别注意
使用AT事件时要提前对内表进行排序sort;
LOOP不能加where条件;
再AT 和 ENDAT之间不能再使用LOOP语法;
进入AT事件块后,工作区中的值除了key字段,其他字段会全部变为默认值,字符型字段值全变为*,数值全部变为0。(ON CHANGE OF不会)
DATA: BEGIN OF ls_data,
c1 TYPE char2,
c2 TYPE char2,
c3 TYPE char2,
c4 TYPE char2,
END OF ls_data.
DATA: lt_data LIKE TABLE OF ls_data.
lt_data = VALUE #( c1 = '11' c2 = '11' ( c3 = '13' c4 = '14' )
( c3 = '23' c4 = '24' )
( c3 = '33' c4 = '34' )
c2 = '42' ( c3 = '43' c4 = '44' ) ).
LOOP AT lt_data INTO ls_data.
AT NEW c2.
WRITE:/ 'AT NEW', ls_data-c1,ls_data-c2,ls_data-c3,ls_data-c4.
ENDAT.
WRITE:/ '非AT', ls_data-c1,ls_data-c2,ls_data-c3,ls_data-c4.
ENDLOOP.
例子
DATA: BEGIN OF ls_data,
c1 TYPE char2,
c2 TYPE char2,
c3 TYPE char2,
c4 TYPE char2,
END OF ls_data.
DATA: lt_data LIKE TABLE OF ls_data.
lt_data = VALUE #( c1 = '11' c2 = '11' ( c3 = '13' c4 = '14' )
( c3 = '23' c4 = '24' )
c2 = '42' ( c3 = '33' c4 = '34' )
( c3 = '43' c4 = '44' ) ).
"AT NEW
LOOP AT lt_data INTO ls_data.
AT NEW c2.
WRITE:/ 'AT NEW:', ls_data-c1,ls_data-c2,ls_data-c3,ls_data-c4,sy-tabix.
ENDAT.
ENDLOOP.
ULINE.
"AT END OF
LOOP AT lt_data INTO ls_data.
AT END OF c2.
WRITE:/ 'AT AT END OF:', ls_data-c1,ls_data-c2,ls_data-c3,ls_data-c4,sy-tabix.
ENDAT.
ENDLOOP.
ULINE.
"ON CHANGE OF
LOOP AT lt_data INTO ls_data.
ON CHANGE OF ls_data-c2.
WRITE:/ 'ON CHANGE OF:', ls_data-c1,ls_data-c2,ls_data-c3,ls_data-c4,sy-tabix.
ENDON.
ENDLOOP.