ABAP中Collect的用法

Posted 我爱编程_怎么可能

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP中Collect的用法相关的知识,希望对你有一定的参考价值。

简单来说:collect在非数值字段相同的情况下,起到了数值字段汇总作用。
非数值字段不同的情况下,效果和append相同执行插入内表操作,当非数值字段相同的时候,则相当于modify的效果,只不过是将数值字段进行汇总相加后更新。

语法:

collect W_table into I_table .

举个简单的栗子:

代码如下:

REPORT ZTEST NO STANDARD PAGE HEADING.

TYPES:BEGIN OF TY_TEST,
ID(3) TYPE C,
MENGE TYPE I,
END OF TY_TEST.

DATA:I_TEST TYPE TABLE OF TY_TEST,
     W_TEST TYPE TY_TEST.
DATA:I_TEST2 TYPE TABLE OF TY_TEST.

W_TEST-ID = '001'.
W_TEST-MENGE = 10.
APPEND W_TEST TO I_TEST.

W_TEST-ID = '001'.
W_TEST-MENGE = 70.
APPEND W_TEST TO I_TEST.

W_TEST-ID = '002'.
W_TEST-MENGE = 20.
APPEND W_TEST TO I_TEST.

W_TEST-ID = '002'.
W_TEST-MENGE = 50.
APPEND W_TEST TO I_TEST.

W_TEST-ID = '002'.
W_TEST-MENGE = 80.
APPEND W_TEST TO I_TEST.

W_TEST-ID = '003'.
W_TEST-MENGE = 30.
APPEND W_TEST TO I_TEST.

W_TEST-ID = '003'.
W_TEST-MENGE = 90.
APPEND W_TEST TO I_TEST.


LOOP AT I_TEST INTO W_TEST.
  COLLECT W_TEST INTO I_TEST2."关键一步。。。"
  CLEAR:W_TEST.
ENDLOOP.

WRITE:/ 'Collect前的内容:'  .
WRITE:/1(12) '编号' ,   '数量'.
LOOP AT I_TEST INTO W_TEST.
  WRITE:/ W_TEST-ID, ' ',W_TEST-MENGE.
  CLEAR:W_TEST.
ENDLOOP.


WRITE:/ .


WRITE:/ 'Collect后的结果:'  .
WRITE:/1(12) '编号' ,   '数量'.
LOOP AT I_TEST2 INTO W_TEST.
  WRITE:/ W_TEST-ID , ' ',W_TEST-MENGE.
  CLEAR:W_TEST.
ENDLOOP.

根据上面的代码,不难看出,我们的基础数据内表I_TEST经过collect之后,提交到I_TEST2中,完成了数值字段的汇总。
COLLECT一般在loop中使用,但是不同于之前博文提到的at end of,at new的用法,使用collect不需要对内表排序,对内表也没有其他限制条件,使用起来非常方便。
这里为了方便,我们的内表结构只设了一个非数值字段和一个数值字段,同时两个内表结构完全一致,但是也能看出效果,经过汇总后,非数值型字段值相同的几行汇总成了一行,数值字段完成累计。

当然,在实际程序开发过程中,可以更灵活多变的使用collect,这样在统计数值字段时就可以节省许多代码量,甚至可以避免loop嵌套之类的耗费时间的写法。希望大家能活学活用,将简单的一个小语法的作用发挥到极致。

这里我们顺便复习下类似的语法: collect , append , modify , insert .

1.
append w_table to i_table.

2.
modify i_table from w_table.

3.
collect w_table into i_table.

4.
insert w_table into i_table index 1.
insert用法和append类似,但必须指定index,通过index指定插入第几行。

在ABAP编程中,我们最常见的操作内表的写法基本就是上述几种用法,尤其是modify,在最后数据内表空余字段填充时都要用到。而insert可能用到的比较少,append也是很常用的写法,有时我们会习惯使用我们熟悉的常用的写法,反倒是忽略了有些简单又高效的语法,尝试着用更精简的代码实现更快的执行速度,对于SAP这种非常考验运行时间的系统来说,每优化一点都是很重要的。

以上是关于ABAP中Collect的用法的主要内容,如果未能解决你的问题,请参考以下文章

ABAP中Collect的用法

abap中modify和collect的用法?哪位能给个详细的解释!!谢谢

ABAP语法-At end of 和collect

[ABAP]collect

新的 ABAP 语法而不是 COLLECT

abap move-corresponding