汇总内表数据:at end of方法和collect方法

来源:互联网 发布:mac草莓红试色cockney 编辑:程序博客网 时间:2024/06/05 02:33
ABAP开发中经常会遇到需要汇总内表中数据的情况,下面介绍两种方法:at end of和collect。
1、at end of方法
    在使用loop循环读取已排序的内表时,可以访问两个自动生成的字段 CNT(<f>) 和SUM(<g>) ,系统在循环到不同值之前以及读取内表最后一个纪录后填充这两个字段。
    CNT(<f>) :如果 <f> 是非数字字段,并且系统是根据 <f> 给内表排序的,则 CNT(<f>) 包含了不同值<f>的序号。
    SUM(<g>) :如果 <g> 是内表的数字字段, SUM(<g>) 将包含 <g> 的值的合计。
注意:a、只能在给内表排序后才能访问以上两个字段,否则会产生运行时错误。
      b、使用at end of,需要另外定义内表的工作区,否则直接使用表头,得到的数据会变成一串*。
2、collect方法
    collect [<wa> into] <itab>.使用该语句,系统会检查内表条目的标准关键字(所有非数字字段)是否相同,如果不同,collect语句的作用与append语句相似,将新行添至内表中;如果相同,collect语句不附加新航,但将工作区中的数字字段内容添加到现有条目中数字字段的内容中。使用该语句前,同样需要先对内表进行排序。

以下面的例子来说明具体用法:

DATABEGIN OF i_data OCCURS 0,
   zlabst LIKE mard-labst,"汇总的良品库存
  maktx  LIKE makt-maktx,"物料描述
   matnr  LIKE afpo-matnr,"物料号
  zpsmng LIKE afpo-psmng,"总的工单数量
  zwemng LIKE afpo-wemng,"总的已交货数量
  zqty   LIKE afpo-psmng,"总的欠单数量
END OF i_data.
DATAw_data LIKE TABLE OF i_data WITH HEADER LINE.
DATAw_line LIKE LINE OF i_data. 

*根据物料号汇总工单总量/总入库量/总欠工单数
    SORT w_data BY matnr.
AT END OF 方法:
    LOOP AT w_data INTO w_line.
      AT END OF matnr.
        SUM.
        i_data-matnr w_line-matnr.
        i_data-maktx w_line-maktx.
        i_data-zlabst w_line-zlabst.
        i_data-zpsmng w_line-zpsmng.
        i_data-zwemng w_line-zwemng.
        i_data-zqty w_line-zqty.
        APPEND i_data.
        CLEAR i_data.
        CLEAR w_line.
      ENDAT.
    ENDLOOP.
*collect 方法
  LOOP AT w_data.
    MOVE-CORRESPONDING w_data TO i_data.
    COLLECT i_data.
    CLEAR w_data.
    CLEAR i_data.
  ENDLOOP.

    内表w_data中包含matnr/maktx/zlabst/zpsmng/zwemng/zqty六个字段,其中前两个为非数字字段,后四个为数字字段,需要汇总的字段为最后三个。
    at end of <f>方法,只汇总内表中f字段之后的字段,因此定义内表时要把不需要汇总的数字字段以及非数字字段(此处为zlabst/maktx)放在f字段(此处为matnr)前面,需要汇总的字段放在后面。
    collect会把内表中所有数字字段汇总起来,所以此例中的zlabst字段也会被汇总,需要另行处理,另外还需注意内表标准关键字的问题。

1 0