AT NEW一般用在LOOP里面。
当我们在LOOP里面处理数据的时候,经常要执行的是当一个字段值改变了,然后我们怎么怎么做。这个就是要用AT NEW。其实有点像分组。
解释起来就是,我有一个内表itab里面有很多行数据,我现在一条一条的loop,当我里面要考虑的字段field的值变了,那这个AT NEW就被触发了。然后我就要执行一定的操作咯。在ENDAT之前。
就比如说咱处理销售订单表,按订单编号先来排个序之后。
SORT i_tab_VBAP by vbeln.
LOOP AT i_tab_VBAP.AT NEW vbeln.ENDAT.
ENDLOOP.
其他类似的还有AT FIRST, AT LAST, AT END OF。很明显的,咱能看出来,我们要去控制这些的字段值变化后的操作的话,首先得把内表按照这个字段来排序,要不然忙来忙去的,没意义。
AT FIRST就是处理遇到的第一个值。一般就是值处理这个分类组的第一个,也就是一般咱只要处理一次的状况。
SORT i_tab_VBAP by vbeln.
LOOP AT i_tab_VBAP.AT FIRST vbeln.WRITE: 'first number :", i_tab_VBAP-vbeln.ENDAT.
ENDLOOP.
AT LAST也是一样的,最后一条的更改。
对于AT END OF,我们也来看一个例子:首先是按照werks工厂来排序内表,AT END OF意思是,当我的这条werks有更改了,也就是说可能1-5条工厂都是001,到第六条工厂变成002了,那我这个第五条就是end of werks了。我需要在到达这条时做些更改的。
REPORT z_at_end_of.TYPES: BEGIN OF ty_tab,werks TYPE mard-werks,matnr TYPE mard-matnr,lgort TYPE mard-lgort,END OF ty_tab.DATA: wtab TYPE ty_tab,itab TYPE TABLE OF ty_tab.START-OF-SELECTION.SELECT matnr werks lgort UP TO 30 ROWS FROM mard INTO CORRESPONDING FIELDS OF TABLE itab.SORT itab BY werks.WRITE: / 'Material Number', 20 'Plant', 27 'Storage Location'.ULINE.LOOP AT itab INTO wtab.WRITE: / wtab-matnr, 20 wtab-werks, 27 wtab-lgort.AT END OF werks.WRITE: '=== At End Of plant - triggers at line', sy-tabix.ENDAT.ENDLOOP.