AT FIRST ,AT NEW 使用方法
DATA: BEGIN OF ITAB OCCURS 0,
F1 TYPE I,
F2(6) TYPE C,
F3(10) TYPE N,
F4(16) TYPE P DECIMALS 2,
END OF ITAB.
DATA: SUB_TOT(10) TYPE P DECIMALS 3.
**--1
ITAB-F1 = 1.
ITAB-F2 = 'ONE'.
ITAB-F3 = 10.
ITAB-F4 = '1000.00'.
APPEND ITAB.
CLEAR ITAB.
ITAB-F1 = 1.
ITAB-F2 = 'ONE'.
ITAB-F3 = 20.
ITAB-F4 = '2000.00'.
APPEND ITAB.
CLEAR ITAB.
ITAB-F1 = 1.
ITAB-F2 = 'ONE'.
ITAB-F3 = 30.
ITAB-F4 = '3000.00'.
APPEND ITAB.
CLEAR ITAB.
*--2
ITAB-F1 = 2.
ITAB-F2 = 'TWO'.
ITAB-F3 = 10.
ITAB-F4 = '1000.00'.
APPEND ITAB.
CLEAR ITAB.
ITAB-F1 = 2.
ITAB-F2 = 'TWO'.
ITAB-F3 = 20.
ITAB-F4 = '2000.00'.
APPEND ITAB.
CLEAR ITAB.
*-- 3
ITAB-F1 = 3.
ITAB-F2 = 'THREE'.
ITAB-F3 = 10.
ITAB-F4 = '1000.00'.
APPEND ITAB.
CLEAR ITAB.
ITAB-F1 = 3.
ITAB-F2 = 'THREE'.
ITAB-F3 = 20.
ITAB-F4 = '2000.00'.
APPEND ITAB.
CLEAR ITAB.
SORT ITAB BY F1.
LOOP AT ITAB.
AT FIRST. "循环内表的第一行数据时执行代码
WRITE: /35 ' MATERIAL DETAILS:'.
ULINE.
ENDAT.
AT NEW F1. "F1 是內表的第一個字段,当F1或者F1左边发生变化时执行语句
WRITE: / 'DETAILS OF MATERIAL:' COLOR 7 , ITAB-F1.
ULINE.
ENDAT.
WRITE: / ITAB-F1, ITAB-F2, ITAB-F3, ITAB-F4.
SUB_TOT = SUB_TOT + ITAB-F4.
AT END OF F1. "当F1或者F1左边全部字段发生变化时执行语句
ULINE.
WRITE: / 'SUB TOTAL :' COLOR 3 INVERSE ON, SUB_TOT COLOR 3 INVERSE ON.
CLEAR SUB_TOT.
ENDAT.
AT LAST. "循环内表的最后一行数据时执行代码
SUM.
ULINE.
WRITE: 'SUM:', ITAB-F4.
ULINE.
ENDAT.
ENDLOOP.
AT FIRST: 循环内表的第一行时触发执行的代码。只执行一次。
AT LAST: 循环内表的最后一行数据时执行代码。即在LOOP里把该执行的都执行完了才执行它。
AT NEW F1: 如果字段F及F的左则全部字段的数据,与上一行数据不一致,则执行代码。 先执行一行,开始判断,如果第二行和第一行值不一样,执行 AT END OF F1;
如果值一样,继续循环AT NEW F1.
AT END OF F1: 如果字段F及F的左则全部字段的数据,与下一行数据不一致时,则执行代码。
AT....End AT语句块内:循环每一行数据时都执行.
At new At F1: 如果字段F及F的左则全部字段的数据,与上一行数据不一致,则执行代码。
非At/End At语句块内:循环每一行数据时都执行
根据上述程序运行的结果可得出如下结论:
1. At First 与At last为一对,分别在循环至整个内表的第一行与最后一行数据时运行。
2. Af new f 与At end of f 为一对,分别在同一个行组内的第一行与最后一行执行。(行组:f字段及f字段前的数据行集合)
3. at 与end at语句块内,工作区的内容,并不是当前行的内容。
a. At First 与At last: 工作区的内容,字符型被 * 填充,数字类型被初始化值填充。
b. Af new f 与At end of f: 工作区的内容, f及f前的字段被当前行填充,f后, 字符型被* 填充,数字类型被初始化值填充,与At First 与At last情况一致。
4. sum 后工作区的数字类型字段的值将等于sum(f),但sum行集的范围存在差异,在文本字段保持不变。
a. At First 与At last: 在整个内表sum
b. Af new f 与At end of f: 在其行组内sum
5. 非At/End At语句块内:
a. 工作区的内容,被当前行填充
b. sum的范围是整个内表,也At First 与At last一样。