先看下代码段:
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.
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.
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 FIRST.
WRITE: 'before at first sum:', ' f1:',itab-f1,' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
sum.
WRITE:/, 'at first sum: ',' f1:', ITAB-F1, ' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
uline.
ENDAT.
At Last: 循环内表的最后一行数据时执行代码。
at last.
WRITE: 'before at last sum:', ' f1:',itab-f1,' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
sum.
WRITE:/, 'at last sum: ',' f1:', ITAB-F1, ' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
uline.
ENDAT.
At new At F1: 如果字段F及F的左则全部字段的数据,与上一行数据不一致,则执行代码。
如上代码,将分别在1,4,6行数据执行代码。
at new f1.
WRITE: 'before at new f1 sum:', ' f1:',itab-f1,' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
sum.
WRITE:/, 'at new f1 sum: ',' f1:', ITAB-F1, ' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
uline.
ENDAT.
At end of f1: 如果字段F及F的左则全部字段的数据,与下一行数据不一致时,则执行代码。
如上代码,将在3,5,7行执行代码。
at end of f1.
WRITE: 'before at end of f1 sum:', ' f1:',itab-f1,' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
sum.
WRITE:/, 'at at end of f1 sum: ',' f1:', ITAB-F1, ' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
uline.
ENDAT.
非At/End At语句块内:循环每一行数据时都执行
WRITE: 'before sum:', ' f1:',itab-f1,' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
sum.
WRITE:/, 'sum: ',' f1:', ITAB-F1, ' ,f2:', itab-f2, ' ,f3:',itab-f3, ' ,f4:',itab-f4.
uline.
根据上述程序运行的结果可得出如下结论:
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一样。