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

  • 相关阅读:
    ajax java base64 图片储存
    计算瓶酒的数量
    Eclipse 打不开
    C# 调用百度翻译Api
    MVC API 权限控制
    C#编程语言与面向对象——委托
    C#编程语言与面向对象—— 多态
    C#编程语言与面向对象——抽象基类与接口
    C#编程语言与面向对象——继承
    动态加载及调用程序集
  • 原文地址:https://www.cnblogs.com/ITHelper/p/2854792.html
Copyright © 2020-2023  润新知