1, Collect介绍
ABAP编程中,经常会要求对loop循环中的一些数值类型(类型 I、P 或F)的字段进行合计,也可以直接使用collect语句进行合计,当然也可以自定义一个变量用来保存累加结果,然后使用At...endat语句进行合计,。
简单说来,collect就是在loop循环的内表中非数值类型字段相同的情况下,对数值类型字段的进行合计。
2, 例子程序1
有点拗口,通过一个简单的程序,一看就明白了。
简单说明一下程序实现的功能,需要合计的内表中有8条数据,按照key字段合计V1 V2的值,最后显示出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
REPORT ztest_collect.
*----------------------------------------------------------------------*
* define internal tables or workarea
* 定义内表或者工作区
*----------------------------------------------------------------------*
DATA : BEGIN OF w_test,
key TYPE string, "这是关键字段,用于根据这列来统计的V1、V2的值(这个关键字段可以是多个)
v1 TYPE i,
v2 TYPE i,
END OF w_test.
DATA : t_data LIKE w_test OCCURS 0 WITH HEADER LINE . "定义数据内表
DATA : t_data_1 LIKE w_test OCCURS 0 WITH HEADER LINE .
DATA : t_test LIKE w_test OCCURS 0 WITH HEADER LINE .
*----------------------------------------------------------------------*
* assign value to internal tables
* 给内表赋值用于测试
*----------------------------------------------------------------------*
DO 8 TIMES .
IF sy-index < 3 .
t_data-key = 'A' .
t_data-v1 = sy-index .
t_data-v2 = sy-index + 1 .
ELSEIF sy-index < 6 .
t_data-key = 'B' .
t_data-v1 = sy-index .
t_data-v2 = sy-index - 1 .
ELSE .
t_data-key = 'C' .
t_data-v1 = sy-index - 1 .
t_data-v2 = sy-index - 2 .
ENDIF .
APPEND t_data.
ENDDO .
t_data_1[] = t_data[].
*----------------------------------------------------------------------*
* process interal table
* 处理内表(统计)
*----------------------------------------------------------------------*
LOOP AT t_data.
COLLECT t_data INTO t_test. "按关键列统计值
ENDLOOP .
*----------------------------------------------------------------------*
* output internal tables
* 打印输出内表
*----------------------------------------------------------------------*
WRITE : sy-uline .
WRITE : '内表数据:' .
LOOP AT t_data.
WRITE : / ' ' ,t_data-key ,t_data-v1, t_data-v2.
ENDLOOP .
WRITE : sy-uline .
WRITE : sy-uline .
WRITE : 'collect后的数据:' .
LOOP AT t_test.
WRITE : / ' ' ,t_test-key , t_test-v1, t_test-v2.
ENDLOOP .
WRITE : sy-uline .
|
显示结果:collect语句按照key中的A B C 三个不同值分别合计了。
3, 例子程序2
当然也可以在是用collect合计时添加条件,比如说之合计V1 V2值都大于2的,collect部分的代码修改如下:
1
2
3
4
5
6
7
8
9
10
|
*----------------------------------------------------------------------*
* process interal table
* 处理内表(统计)
*----------------------------------------------------------------------*
LOOP AT t_data.
IF t_data-v1 > 2 AND
t_data-v2 > 2.
COLLECT t_data INTO t_test. "按关键列统计值
ENDIF.
ENDLOOP .
|
显示结果:
发现key为A的场合下,V1和V2没有同时大于2的记录,所以在合计结果中就没有A的数据。
4, collect中的错误信息
collect过程中会报出如下错误信息,意思是内表中的非key键有的是非数值。
1
|
'You can only use the collect command in a table if all of its non-keyfields are numeric(type I,P or F)
|
所以,使用collect时要求内表中所有的非key fields必须是I,P或者F数据类型。
对于standard table 而言,如果不指定key fields那么它的key fields就那些非I, P,F数据类型的字段,
对于sorted table 和 hash table,key fields是需要指定的。
注意:货币类型CURR实际类型是P,所以也可以使用collect累加
以上。