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: 如果字段FF的左则全部字段的数据,与上一行数据不一致,则执行代码。 先执行一行,开始判断,如果第二行和第一行值不一样,执行 AT END OF F1;

如果值一样,继续循环AT NEW F1.

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

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

 

posted @ 2019-10-23 16:06  纱缚之印  阅读(366)  评论(0编辑  收藏  举报