ABAP 字段类型不一样导致相加之后金额错误

ABAP 字段类型不一样导致相加之后金额错误

写在前面的总结

  1. 如果需要不同底表的字段相加的值,那么最好是根据条件去分别算出那些值放在临时内表里面,再去根据条件读取临时内表,读取完之后取出对应的值进行计算,不然可能会因为字段有不同长度,计算的结果出错
  2. 如果要多个表连接,一定要注意连接的条件和思路,思路要清晰,连接条件要正确
  3. 在select语句里面如果使用sum函数,字段长度不相等,可能会导致计算出来的值有问题
  4. 尽量在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 ).

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值