#COLLECT的作用
假设目前有两种总账科目 ,一种是 8开头,一种是非8开头
那么,现在想要将两种总账科目的数据进行合计,其中非80开头的根据科目名称将金额合计,而80开头的数据,除了科目名称以外,多一个合计维度,那就是根据订单合计
我们的代码就应该如下写
SELECT belnr,BUKRS,kostl,GJAHR,SGTXT,HKONT,SHKZG,
aufnr,
"SUM( DMBTR ) AS DMBTR,
"SUM( WRBTR ) AS WRBTR
dmbtr,
wrbtr
FROM bseg
INTO CORRESPONDING FIELDS OF TABLE @i_bseg
WHERE belnr = @i_belnr
AND bukrs = @i_bukrs
AND gjahr = @i_gjahr.
"GROUP BY belnr,BUKRS,kostl,GJAHR,SGTXT,HKONT,aufnr,SHKZG.
sort i_bseg by SGTXT belnr BUKRS GJAHR SHKZG kostl HKONT.
"从上述代码可以看到,原本我们是不区分80开头和非80开头的,统一都合并掉
"为了区分80开头和非80开头的数据,我们将语句中的 SUM 和 group先去掉,在未合并之前,先统一先放进变量I_BSEG里面
“然后在下述代码里循环 将非80开头的去除订单号放到变量 I_BSEG_50 里面,然后COLLECT,由于没有订单号,所以只按照科目名称进行合并
将80开头的变量不去除订单号放到 I_BSEG_80里面,由于有订单号,所以按照订单号和科目名称合并,比非80开头的多了一个维度订单号。
“”然后分别进行COLLECT,就会发现
LOOP AT I_BSEG INTO LS_BSEG.
if LS_BSEG-HKONT+0(2) <> '80'.
clear LS_BSEG-aufnr.
collect LS_BSEG into I_BSEG_50.
elseif LS_BSEG-HKONT+0(2) = '80'.
collect LS_BSEG into I_BSEG_80.
endif.
ENDLOOP.
sort I_BSEG_50 by SGTXT belnr BUKRS GJAHR SHKZG kostl HKONT.
sort I_BSEG_80 by SGTXT belnr BUKRS GJAHR SHKZG kostl HKONT.
CLEAR I_BSEG.
APPEND LINES OF I_BSEG_50 to I_BSEG.
APPEND LINES OF I_BSEG_80 to I_BSEG.