CKM3按物料查询,查不到在途的成本信息,需要输入交货单号和行号查询
因为按物料查询,按物料+BWKEY ,VBELN =空,POSNR=空取CKMLHD表的KALNR成本估算号
按交货单号+行号取CKMLHD表的KALNR成本估算号
两者成本估算号不一样
101227110
101539586
两者可以通过PROCESS和PKALNR关联
* 在途发货数量和初级评估金额取值
SELECT a~matnr,a~kalnr,
a~vbeln,a~posnr,
a~bwkey,
b~jahrper,
SUM( b~quant ) AS quant,
SUM( b~stval ) AS stval
FROM ckmlhd AS a
INNER JOIN mldoc AS b
ON a~kalnr = b~kalnr
INTO TABLE @DATA(lt_fh)
WHERE b~budat IN @rt_budat
AND a~matnr IN @s_matnr
AND a~bwkey IN @rt_bwkey
AND a~sobkz = 'T'
AND a~vbeln IN @s_vbeln
AND a~posnr IN @s_posnr
AND b~jahrper IN @rt_jah
AND b~glvor = 'RMWL'
AND b~posart = 'UP'
AND b~categ = 'VN'
GROUP BY a~matnr,a~kalnr,a~vbeln,a~posnr,a~bwkey,b~jahrper.
* 发货价格差异
SELECT a~matnr,a~kalnr,
a~vbeln,a~posnr,
a~bwkey,
b~jahrper,
SUM( b~prd ) AS prd,
SUM( b~kdm ) AS kdm
FROM ckmlhd AS a
INNER JOIN mldoc AS b
ON a~kalnr = b~kalnr
INTO TABLE @DATA(lt_fh_jgcy)
WHERE "b~budat IN @rt_budat
a~matnr IN @s_matnr
AND a~bwkey IN @rt_bwkey
AND a~sobkz = 'T'
AND a~vbeln IN @s_vbeln
AND a~posnr IN @s_posnr
AND b~jahrper IN @rt_jah
AND b~categ = 'VN'
GROUP BY a~matnr,a~kalnr,a~vbeln,a~posnr,a~bwkey,b~jahrper.
* 收货数量和初级评估金额
SELECT a~matnr,a~kalnr,
a~vbeln,a~posnr,
a~bwkey,
b~jahrper,
SUM( b~quant ) AS quant,
SUM( b~stval ) AS stval
FROM ckmlhd AS a
INNER JOIN mldoc AS b
ON a~kalnr = b~kalnr
INTO TABLE @DATA(lt_sh)
WHERE b~budat IN @rt_budat
AND a~matnr IN @s_matnr
AND a~bwkey IN @rt_bwkey
AND a~vbeln IN @s_vbeln
AND a~posnr IN @s_posnr
AND a~sobkz = 'T'
AND b~jahrper IN @rt_jah
AND b~glvor = 'RMWL'
AND b~posart = 'UP'
AND b~categ = 'ZU'
GROUP BY a~matnr,a~kalnr,a~vbeln,a~posnr,a~bwkey,b~jahrper.
* 收货价格差异
SELECT a~matnr,a~kalnr,
a~vbeln,a~posnr,
a~bwkey,
b~jahrper,
SUM( b~prd ) AS prd,
SUM( b~kdm ) AS kdm
FROM ckmlhd AS a
INNER JOIN mldoc AS b
ON a~kalnr = b~kalnr
INTO TABLE @DATA(lt_sh_jgcy)
WHERE
" b~budat IN @rt_budat
a~matnr IN @s_matnr
AND a~bwkey IN @rt_bwkey
AND a~vbeln IN @s_vbeln
AND a~posnr IN @s_posnr
AND a~sobkz = 'T'
AND b~jahrper IN @rt_jah
AND b~categ = 'ZU'
GROUP BY a~matnr,a~kalnr,a~vbeln,a~posnr,a~bwkey,b~jahrper.
* 在途的未分配价格差异和汇率差异:我这边的业务相对简单,取CATEG=ND的就可以了
SELECT a~matnr,a~kalnr,
a~vbeln,a~posnr,
a~bwkey,
b~jahrper,
SUM( b~prd ) AS prd,
SUM( b~kdm ) AS kdm
FROM ckmlhd AS a
INNER JOIN mldoc AS b
ON a~kalnr = b~kalnr
INTO TABLE @DATA(lt_nd)
WHERE a~matnr IN @s_matnr
AND a~bwkey IN @rt_bwkey
AND a~vbeln IN @s_vbeln
AND a~posnr IN @s_posnr
AND a~sobkz = 'T'
AND b~jahrper IN @rt_jah
AND b~categ = 'ND'
GROUP BY a~matnr,a~kalnr,a~vbeln,a~posnr,a~bwkey,b~jahrper.
* 初级评估期初金额
取MLDOC表的CATEG=AB,JAHRPER = 当前期间的 STVAL
+ MLDOC_EXTRACT表,JAHRPER < 当前期间的STVAL
SELECT a~matnr,a~kalnr,
a~vbeln,a~posnr,
a~bwkey,
b~jahrper,
SUM( stval ) AS stval,
SUM( prd ) AS prd,
SUM( kdm ) AS kdm
INTO TABLE @DATA(lt_cjpg)
FROM ckmlhd AS a
INNER JOIN mldoc AS b
ON a~kalnr = b~kalnr
WHERE a~matnr IN @s_matnr
AND a~bwkey IN @rt_bwkey
AND a~vbeln IN @s_vbeln
AND a~posnr IN @s_posnr
AND a~sobkz = 'T'
AND b~jahrper IN @rt_jah
AND b~categ = 'AB'
GROUP BY a~matnr,a~kalnr,a~vbeln,a~posnr,a~bwkey,b~jahrper.
LOOP AT lt_cjpg INTO DATA(ls_cjpg).
MOVE-CORRESPONDING ls_cjpg TO ls_out.
ls_out-gjahr = ls_cjpg-jahrper+0(4).
ls_out-poper = ls_cjpg-jahrper+4(3).
ls_out-cjpg_jgcy = ls_cjpg-prd.
ls_out-cjpg_hlcy = ls_cjpg-kdm.
SELECT SUM( stval )
FROM ckmlhd AS a
INNER JOIN mldoc_extract AS b
ON a~kalnr = b~kalnr
WHERE a~matnr = @ls_cjpg-matnr
AND a~bwkey = @ls_cjpg-bwkey
AND a~kalnr = @ls_cjpg-kalnr
AND a~sobkz = 'T'
AND b~jahrper < @ls_cjpg-jahrper
INTO @DATA(lv_stval).
ls_out-cjpg_qc = lv_stval + ls_cjpg-stval.
COLLECT ls_out INTO gt_out.
CLEAR: ls_cjpg,lv_stval.
ENDLOOP.
* 实际值=初级评估金额+价格差异+汇率差异+未分配
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
READ TABLE lt_ebew TRANSPORTING NO FIELDS WITH KEY vbeln = <fs_out>-vbeln
posnr = <fs_out>-posnr
BINARY SEARCH.
IF sy-subrc NE 0.
DELETE gt_out.
CONTINUE.
ENDIF.
IF <fs_out>-unassign_kdm IS INITIAL AND <fs_out>-unassign_prd IS INITIAL.
<fs_out>-fh_sjz = <fs_out>-fh_stval + <fs_out>-fh_prd + <fs_out>-fh_kdm. "实际值=初级评估金额+价格差异+汇率差异
<fs_out>-sh_sjz = <fs_out>-sh_stval + <fs_out>-sh_prd + <fs_out>-sh_kdm.
ELSE.
<fs_out>-fh_sjz = <fs_out>-fh_stval + <fs_out>-fh_prd + <fs_out>-fh_kdm.
<fs_out>-sh_sjz = <fs_out>-sh_stval + <fs_out>-sh_prd + <fs_out>-sh_kdm + <fs_out>-unassign_kdm + <fs_out>-unassign_prd.
ENDIF.
ENDLOOP.
结果