ABAP报表数据处理:内表数据汇总COLLECT和AT END OF、AT*

一、 at end of、at new、at last

1)在写abap 的过程中可能需要统计、求和等,那么在loop ... endloop 中间,有个AT ,<…>,ENDAT循环。其中的包括: FRIST,LAST, NEW , END OF。
2)这些可以用来进行内表中按某个字段f 进行分组统计。
3)当f字段或者f字段左边的字段内容发生变化时该事件后面的语句都会执行。
以下以处理工资报表数据为例(简化例子):

  • 工资内表结构字段及填充后的数据如下表:
ABAP报表数据处理:内表数据汇总COLLECT和AT END OF、AT*_第1张图片
工资内表字段.jpg
  • 与loop配合使用汇总(loop不加where条件)
    注意要先对内表数据进行排序
SORT it_data BY werks orgeh pernr.
LOOP AT it_data.
*在内表循环过程中遇到新的人事范围则执行
  AT NEW werks.
    SKIP.
    ULINE.
    WRITE :/8(35) '按人事范围汇总:'.
    WRITE:/8(20) '人事范围编码',28(12)'部门编码',40(10)'员工号',50(8)'姓名',58(12)'基本工资',70(12)'职务工资',82(8)'税金',90(8)'实发'.
  ENDAT.

  WRITE :/8(20) it_data-werks,28(12) it_data-orgeh ,40(10) it_data-pernr,50(8) it_data-ename,58(10) it_data-1jbg,68(10) it_data-1zwg,78(10) it_data-x403,90(10) it_data-x559.

接下

*在部门结束时(下一个部门开始前),输出部门小计
  AT END OF orgeh.
    SUM.
    SKIP.
    WRITE :/8(20) '部门小计:'.
    WRITE:
         /8(10) '人数',
         18(12) it_data-count,
         56(10) it_data-1jbg NO-GROUPING NO-SIGN,
         66(10) it_data-1zwg NO-GROUPING NO-SIGN ,
         76(10) it_data-x403 NO-GROUPING NO-SIGN,
         88(10) it_data-x559 NO-GROUPING NO-SIGN.
    SKIP.
  ENDAT.
*只执行一次最终汇总
  AT LAST.
    SUM.
    ULINE.ULINE.
    WRITE:
          /8(20) '合计:'.
    WRITE:
           /8(10) '人数',
           18(12) it_data-count,
           56(10) it_data-1jbg NO-GROUPING NO-SIGN,
           66(10) it_data-1zwg NO-GROUPING NO-SIGN ,
           76(10) it_data-x403 NO-GROUPING NO-SIGN,
           88(10) it_data-x559 NO-GROUPING NO-SIGN.
  ENDAT.
  CLEAR it_data.
ENDLOOP.
  • 处理后的数据结果:
ABAP报表数据处理:内表数据汇总COLLECT和AT END OF、AT*_第2张图片
工资汇总结果.jpg

以上在loop过程中对工资单数据分别按人事范围、部门汇总,最后做总的统计。


二、 COLLECT

ABAP对内表插入数据有3种:APPEND,COLLECT,INSERT。
1) 要计算数字字段之和或要确保内表中没有出现重复条目,使用 COLLECT 语句,它根据标准关键字处理行(将关键字相同的其他数字字段值汇总)。
2)要在内表现有行之前插入新行,请使用 INSERT 语句。
3)要将内表条目内容复制到另一个内表中并且覆盖该目标表格,使用 MOVE 语句。
以下举例说明collect常见用法。

  • 定义内表:
DATA: BEGIN OF wa_data,
  col1 TYPE c,
  col2 TYPE i,
  col3 TYPE i,
  END OF wa_data.
DATA: it_data LIKE TABLE OF wa_data WITH HEADER LINE.
DATA: itab LIKE  HASHED TABLE OF wa_data WITH UNIQUE KEY col1 WITH HEADER LINE. 

注意:此处itab作为汇总表定义为hashed table 且明确唯一key列(普通内表也可),collect要求非KEY列都得是数据类型(I,P,F)

  • 填充内表:
wa_data-col1 = 'A'.
DO 2 TIMES.
  wa_data-col2 = 1.
  wa_data-col3 = 1 * sy-index.
APPEND wa_data TO it_data.
ENDDO.
wa_data-col1 = 'B'.
DO 2 TIMES.
  wa_data-col2 = 2.
  wa_data-col3 = 2 * sy-index.
  APPEND wa_data TO it_data.
ENDDO.
wa_data-col1 = 'C'.
DO 2 TIMES.
  wa_data-col2 = 3.
  wa_data-col3 = 3 * sy-index.
  APPEND wa_data TO it_data.
ENDDO.
  • 使用collect处理内表:按关键列(默认非数字列)汇总
LOOP AT it_data .
 COLLECT it_data INTO itab.
ENDLOOP.
ABAP报表数据处理:内表数据汇总COLLECT和AT END OF、AT*_第3张图片
collect1.jpg
  • 内表有多个关键列

DATA: itab LIKE TABLE OF wa_data with KEY col1 col WITH HEADER LINE .

![collect2.jpg](http://upload-images.jianshu.io/upload_images/1377127-91fd4453d1b23b97.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如上图(指定两个关键列),只有col1和col列都相同才会被collect;若未指定COL列为关键列,则无法collect。
---

你可能感兴趣的:(ABAP报表数据处理:内表数据汇总COLLECT和AT END OF、AT*)