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累加
以上。
发表评论