一、 at end of、at new、at last
1)在写abap 的过程中可能需要统计、求和等,那么在loop ... endloop 中间,有个AT
2)这些可以用来进行内表中按某个字段f 进行分组统计。
3)当f字段或者f字段左边的字段内容发生变化时该事件后面的语句都会执行。
以下以处理工资报表数据为例(简化例子):
- 工资内表结构字段及填充后的数据如下表:
- 与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.
- 处理后的数据结果:
以上在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.
- 内表有多个关键列
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。
---