ABAP 字段类型不一样导致相加之后金额错误
写在前面的总结
- 如果需要不同底表的字段相加的值,那么最好是根据条件去分别算出那些值放在临时内表里面,再去根据条件读取临时内表,读取完之后取出对应的值进行计算,不然可能会因为字段有不同长度,计算的结果出错
- 如果要多个表连接,一定要注意连接的条件和思路,思路要清晰,连接条件要正确
- 在select语句里面如果使用sum函数,字段长度不相等,可能会导致计算出来的值有问题
- 尽量在select语句的筛选条件里面筛选数据,使得到的内表的行数尽量更少,更准确一些。
原来的代码:
原来的代码:
( CASE WHEN c~aufnr IS INITIAL
THEN ( SUM( CASE WHEN c~bwart = '102' THEN c~dmbtr * -1 ELSE c~dmbtr END ) )
ELSE SUM( CASE WHEN c~bwart = '102' THEN c~dmbtr * -1 ELSE c~dmbtr END ) + d~prd END ) AS dmbtr, "模具入库金额
现在修改成:
( CASE WHEN c~aufnr IS INITIAL
THEN ( SUM( CASE WHEN c~bwart = '102' THEN c~dmbtr * -1 ELSE c~dmbtr END ) )
ELSE SUM( CASE WHEN c~bwart = '102' THEN c~dmbtr * -1 ELSE c~dmbtr END ) + ( CASE WHEN abs( d~prd ) > 0 THEN d~prd ELSE 0 END ) END ) AS dmbtr, "模具入库金额
程序名:z_test_lhy2
示例程序1
REPORT z_test_lhy2.
*&--------------------------Variables----------------------------------*
TYPES: BEGIN OF ty_out,
werks TYPE mseg-werks, "工厂
matnr2 TYPE mara-matnr, "物料
aufnr TYPE mseg-aufnr, "订单
END OF ty_out.
DATA: gs_out TYPE ty_out,
gt_out TYPE TABLE OF ty_out.
*&------------------------------Logic----------------------------------*
gs_out-werks = '1710'.
gs_out-matnr2 = 'MZ-FG-C990'.
gs_out-aufnr = '000001000920'.
APPEND gs_out TO gt_out.
SELECT
a~werks, "工厂
a~matnr2, "物料
( CASE WHEN b~aufnr IS INITIAL
THEN SUM( CASE WHEN b~bwart = '102' THEN b~dmbtr * -1 ELSE b~dmbtr END )
ELSE SUM( CASE WHEN b~bwart = '102' THEN b~dmbtr * -1 ELSE b~dmbtr END ) + c~prd END ) AS dmbtr_hj, "合计金额
c~prd,
b~aufnr,
SUM( CASE WHEN b~bwart = '102' THEN b~dmbtr * -1 ELSE b~dmbtr END ) AS dmbtr "原始金额
FROM @gt_out AS a
LEFT JOIN mseg AS b ON a~werks = b~werks AND a~matnr2 = b~matnr
LEFT JOIN mldoc AS c ON b~aufnr = c~aufnr AND c~tcode = 'KO88'
WHERE substring( b~budat_mkpf,1,4 ) = '2021'
GROUP BY a~werks,a~matnr2,b~aufnr,c~prd,b~aufnr
INTO TABLE @DATA(lt_temp).
单独定义两个变量之后再相加,数值是没有问题的,都是正确的:
汇总MSEG表和MLDOC表
这里想先汇总MSEG的金额,再去mldoc表去查询价格差异字段prd,并汇总价格差异的金额,可以用下面的做法:
SELECT
a~werks, "工厂
a~matnr2, "物料
* ( CASE WHEN b~aufnr IS INITIAL
* THEN SUM( CASE WHEN b~bwart = '102' THEN b~dmbtr * -1 ELSE b~dmbtr END )
* ELSE SUM( CASE WHEN b~bwart = '102' THEN b~dmbtr * -1 ELSE b~dmbtr END ) + c~prd END ) AS dmbtr_hj, "合计金额
* c~prd,
b~aufnr,
SUM( CASE WHEN b~bwart = '102' THEN b~dmbtr * -1 ELSE b~dmbtr END ) AS dmbtr "原始金额
FROM @gt_out AS a
LEFT JOIN mseg AS b ON a~werks = b~werks AND a~matnr2 = b~matnr AND a~aufnr = b~aufnr
"LEFT JOIN mldoc AS c ON a~aufnr = c~aufnr AND c~tcode = 'KO88'
WHERE substring( b~budat_mkpf,1,4 ) = '2021'
GROUP BY a~werks,a~matnr2,b~aufnr
INTO TABLE @DATA(lt_mseg).
SORT lt_mseg BY werks matnr2 dmbtr.
"cl_demo_output=>display( lt_mseg ).
SELECT
a~werks,"工厂
a~matnr2,"物料
a~aufnr, "订单
SUM( b~prd ) AS prd "价格差异
FROM @lt_mseg AS a
LEFT JOIN mldoc AS b ON a~aufnr = b~aufnr AND b~tcode = 'KO88'
GROUP BY a~werks,a~matnr2,a~aufnr
INTO TABLE @DATA(lt_mldoc).
SORT lt_mldoc BY werks matnr2 aufnr.
"cl_demo_output=>display( lt_mldoc ).