汇总内表数据:at end of方法和collect方法
2012-11-12 19:59阅读:
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语句不附加新航,但将工作区中的数字字段内容添加到现有条目中数字字段的内容中。使用该语句前,同样需要先对内表进行排序。
以下面的例子来说明具体用法:
DATA: BEGIN
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.
DATA: w_data LIKE
TABLE OF
i_data WITH HEADER
LINE.
DATA: w_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字段也会被汇总,需要另行处理,另外还需注意内表标准关键字的问题。