在Internal Table 中使用AT FIRST , AT NEW, AT THE END OF , AT LAST, Sum

先看下代码段:

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.
 
程序中内表数据如下:
 
image
 

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.
image

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.

image

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.

image

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.

image

非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.

image

根据上述程序运行的结果可得出如下结论:

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一样。

原文地址:https://www.cnblogs.com/ITHelper/p/2854792.html