汇总内表数据:at end of方法和collect方法
2016-05-05 12:11
399 查看
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字段也会被汇总,需要另行处理,另外还需注意内表标准关键字的问题。
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字段也会被汇总,需要另行处理,另外还需注意内表标准关键字的问题。
相关文章推荐
- x264 参数详解【很强大、很细致,不再为不懂啥意思很烦恼】
- shell从入门到放弃(上)
- x264参数 中文说明
- int,String,数组的默认值输出问题
- linux基础之bash特性
- Linux内核设计与实现 第十七章
- 添加搜索路径到FileUtils
- HDU 1317 XYZZY
- GridView添加网格线
- Android Studio开发环境变量配置
- android广播的使用方式
- x264编码指南——码率控制
- 请教一个问题:关于 webrtc 通信的问题
- 《Linux内核设计与实现》第17章读书笔记
- Django session 详解-part II-session
- js代码的调试
- java 中== equal hashcode()什么的之间的关系
- android dialog activity
- POJ 1773 Parity game 带权并查集
- git仓库之间同步