内部表的内部命令是ABAP和其他语言最大的区别,这几个命令是ABAP特有的,也正是有了这几个命令,它才能处理成千上万复杂的程序报表。如果你把这几个命令学好的话,可以说ABAP你会了八成了。下面我们来看看这四个命令。AT FIRST, AT NEW, AT END OF, AT LAST.下面我们来举例说明。
那么当我们进行如下程序代码时会进行如下的操作。
LOOP AT IT_SAMP INTO WA_SAMP.
AT FIRST.
WRITE:'When the loop is the first, come here!'.
ENDAT.
AT NEW MATNR.
WRITE:'When the MATNR is the first, come here!'.
ENDAT.
AT END OF MATNR.
WRITE:'When the MATNR will be changed, come here!'.
SUM.
WRITE:NUM.
ENDAT.
AT LAST.
WRITE:'When the loop is last, come here!'.
ENDAT.
ENDLOOP.
例如内部表IT_SAMP里保存了如下的数据。
我们来解释一下:
1,AT FIRST和ENDAT:这之间的语句是在LOOP循环第一次的执行。一个LOOP语句里只会执行一次。上图中,LOOP第一行的时候执行此语句。
2,AT NEW和ENDAT:这个会根据NEW后面的字段,结合此字段前的所有字段拼接起来,只要拼接的字段改变了话,就会执行这之中的语句。比如AT NEW MATNR。在MATNR前的还有DDATE这个字段,那么把这两个字段拼起来,第一句就是20080407物料A,所以改变的地方有1,3,5,8,9。故在本例中'When the MATNR is the first, come here!'会被输出五次,而且是在第1,3,5,8,9次LOOP循环的时候。
3,AT END OF和ENDAT:这个会根据OF后面的字段,结合此字段前的所有字段拼接起来,只要拼接的字段将要改变的时候,就会执行这中间的语句。比如AT END OF MATNR。在MATNR前的还有DDATE这个字段,那么把这两个字段拼起来,第一句就是20080407物料A,所以在将要改变的地方就是2,4,7,8,9.故在本例'When the MATNR will be changed, come here!'会被输出五次,而且是在第2,4,7,8,9次LOOP循环的时候。
4,AT LAST和ENDAT:这之间的语句是在LOOP循环的最后一次执行。也就是要结束的时候。本例中就是在第九次循环后面。
在上面我们还用到了SUM这个语句,这个意思是说把每组的数量进行合计。比如本例中。第一次SUM是在第二次LOOP执行的时候,这时如果我们输入出的NUM就是300,即200+100.