ABAP LOOP AT 中使用AT FIRST,AT NEW ,AT END OF ,AT LAST

ABAP LOOP AT 中AT FIRST,AT NEW ,AT END OF ,AT LAST的用法

本文主要介绍一下ABAP中的关于内表操作中的一些特殊用法。

AT FIRST ,AT NEW,AT END OF,AT LAST 都是ABAP中内表循环的事件块。

 

LOOP AT itab result ...
	AT FIRST.
	...
	ENDAT.
		AT NEW comp1.
			...
		ENDAT.
			AT NEW comp2.
				...
			ENDAT.
		....
		....
			AT END OF comp2.
				...
			ENDAT.
		AT END OF comp2.	
			...
		ENDAT.
	AT LAST.
	...
	ENDAT.
ENDLOOP.

 

AT FIRST      : 循环内表的第一行时触发执行的代码。只执行一次。

 

 AT LAST       : 循环内表的最后一行数据时执行代码。即在LOOP 里把该执行的都执行完了才执行它。

 AT NEW F     : 如果字段F 及F 的左侧全部字段的数据,与上一行数据不一致,则执行代码。

 

就比如:
AAA
AAA
AAB
那么在第一个AAA和AAB的时候就会触发事件。

 AT END OF F: 如果字段F 及F 的左侧全部字段的数据,与下一行数据不一致,则执行代码。

 

 

所以AT NEW F 和AT END OF F都是不用考虑F 字段右边的字段内容的,所以在字段F 之后的字段的内容,系统将默认将设置为'*',也就是说F之后的内容不管相同与否,都视为'*'.

 

我们举个例子来看:

在执行AT NEW F.之前的工作区是有数据。
ABAP LOOP AT 中使用AT FIRST,AT NEW ,AT END OF ,AT LAST_第1张图片
 

我们看AT NEW F在实际代码中的使用。

 

然后我们看执行完AT NEW以后的工作区中的数据,会发现matnr后面字段的数据全部消失了。ABAP LOOP AT 中使用AT FIRST,AT NEW ,AT END OF ,AT LAST_第2张图片

 

 

 接下来我们通过一个具体案例来解释用法。

AT NEW F1: 假设一内表:
COL1 	COL2 	COL3
A	        A	        A
A	        A	        B
A	        B	        C

 

 

AT NEW COL2,一共会触发两次,并不是一次!首先先忽略COL3(COL2 后面的所有字段)的值,它并不会影响事件触发。

 

第一次触发就是遍历到第一行时,因为第一行COL1、COL2要和上一行的COL1、COL2做比较,但那时我们现在只是遍历到第一行,并没有上一行给我们比较。换个角度,上一行是不存在的或者说是空再或者是未初始化的,也就是说第一行的COL1、COL2和上一行COL1、COL2并不相同,一个有数据,一个没有数据,当然不同,所以此时会触发AT NEW COL2,后面的代码就会执行

 

但当遍历到第二行的AAB的时候,因为第二行的COL1=第一行的COL1且第二行COL2=第一行的COL2,所以不会触发AT NEW COL2,继续循环。

 

第二次触发是遍历到第三行的时候,虽然第三行的COL1 = 第二行的COL1 但是COL2 的值为B,不等于第二行的COL2 ,所以会触发AT NEW COL2.

 

***AT END OF COL2***

那么同样的例子,对于AT END OF COL2,它也会触发两次,同样忽略COL3的值。

第一次触发是遍历到第二行的时候, 因为第二行COL2的A并不等于其下一行(第三行)的COL2的B,所以会触发AT END OF COL2.

 

第二次触发是在遍历到最后一行的时候,第三行COL1,COL2字段要和下一行比较,但是下一行又不存在,这就类似与AT NEW COL2遍历到第一行的时候。

 

 

 

 

你可能感兴趣的:(ABAP)