SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理

业务背景:SAP交货单只有数量,没有金额,所以开发报表从订单的价格按数量计算交货单的金额。

用户反馈近期报表出现异常:

c 复制代码
****2012/12/12 清风雅雨 规格变更 Chg 修改开始
** 修改原因:由于余数为0时,可能会报错溢出。所以增加检查。
*          wa_alv-ttlwrx = ( wa_alv-lfimgr * wa_konv_pr01-kbetr / wa_konv_pr01-kpein +
*                  wa_alv-lfimgr * wa_konv_zr01-kbetr / wa_konv_zr01-kpein +
*                  wa_alv-lfimgr * wa_konv_pbxx-kbetr / wa_konv_pbxx-kpein +
*                  wa_alv-lfimgr * wa_konv_pb00-kbetr / wa_konv_pb00-kpein ) * ( 1 + p1 ) -
*                  wa_alv-lfimgr * wa_konv_zk01-kbetr / wa_konv_zk01-kpein +
*                  + wa_alv-lfimgr * wa_konv_zk03-kbetr / wa_konv_zk03-kpein.
      TRY.
          wa_alv-ttlwrx = ( wa_alv-lfimgr * wa_konv_pr01-kbetr / wa_konv_pr01-kpein +
                  wa_alv-lfimgr * wa_konv_zr01-kbetr / wa_konv_zr01-kpein +
                  wa_alv-lfimgr * wa_konv_pbxx-kbetr / wa_konv_pbxx-kpein +
                  wa_alv-lfimgr * wa_konv_pb00-kbetr / wa_konv_pb00-kpein ) * ( 1 + p1 ) -
                  wa_alv-lfimgr * wa_konv_zk01-kbetr / wa_konv_zk01-kpein +
                  + wa_alv-lfimgr * wa_konv_zk03-kbetr / wa_konv_zk03-kpein.
        CATCH cx_sy_zerodivide.
          IF p_jk <> 'X'.
            MESSAGE s000 WITH '交货单' wa_alv-vbeln '被0除请检查定价数量'.
          ENDIF.
          wa_alv-ttlwrx = 0.
      ENDTRY.
****2012/12/12 清风雅雨  规格变更 Chg 修改结束

当年年少不成熟,前台报cx_sy_zerodivide错误,就采用把异常CATCH后直接前台显示,并把值赋为0,而现在用户需要知道准确的值 ,时隔13年,再一次调查:

由于ZK01折让价格 没有价格单位,验证一下:

c 复制代码
REPORT  ztmp_test2.
DATA wa_konv_zk01 TYPE konv.
DATA l_kbetr TYPE konv-kbetr.
wa_konv_zk01-kbetr = 0.
wa_konv_zk01-kpein = 0.
l_kbetr = wa_konv_zk01-kbetr / wa_konv_zk01-kpein.
WRITE : l_kbetr.

输出0

c 复制代码
REPORT  ztmp_test2.
DATA wa_konv_zk01 TYPE konv.
DATA l_kbetr TYPE konv-kbetr.
wa_konv_zk01-kbetr = 1.
wa_konv_zk01-kpein = 0.
l_kbetr = wa_konv_zk01-kbetr / wa_konv_zk01-kpein.
WRITE : l_kbetr.

报cx_sy_zerodivide

总结:

1、0/0 = 0

2、有值/0 报cx_sy_zerodivide

问题找到了怎么解决?

检查KONV ZK01类型,13年才有38条记录。所以问题一直没有爆露。

解决方案:

针对没有价格单位kpein的计算逻辑:

交货单XXX金额= 交货单数量/订单数量 x 订单条件金额

而有价格单位的计算逻辑:

交货单XXX金额= 交货单数量 x 订单条件金额/订单条件价格单位

c 复制代码
IF wa_konv_zk01-kpein NE 0.
        zk01tmp = wa_alv-lfimgr * wa_konv_zk01-kbetr / wa_konv_zk01-kpein.
ELSE.
        zk01tmp = wa_alv-lfimgr / wa_alv-kwmeng * wa_konv_zk01-kbetr
ENDIF.

比如本例:

如果交货5万则5/540000=40000
如果交货2万则2/5
40000=16000

同样的算法取其他5个定价条件:

复制代码
	pr01tmp,
    zr01tmp,
    pbxxtmp,
    pb00tmp,
    zk03tmp.

这样可以取到6个正确的定价条件的值,再进行交货单行项目含税金额的计算

c 复制代码
  wa_alv-ttlwrx = ( pr01tmp + zr01tmp + pbxxtmp + pb00tmp ) * ( 1 + p1 ) -
                    zk01tmp + zk03tmp.
相关推荐
爱喝水的鱼丶18 分钟前
SAP-ABAP:数据类型与数据对象(8篇) 第七篇:进阶优化篇——基于类型与对象特征的性能优化技巧
运维·数据库·学习·性能优化·sap·abap·开发交流
爱喝水的鱼丶1 天前
SAP-ABAP:数据类型与数据对象(8篇) 第四篇:关系映射篇——从类型定义到对象实例的转化逻辑
开发语言·数据库·学习·sap·abap
爱喝水的鱼丶2 天前
SAP-ABAP:ABAP函数 NUMBER_GET_NEXT 详解:从编号范围对象获取下一个编号
运维·数据库·学习·sap·abap
爱喝水的鱼丶2 天前
SAP-ABAP:数据类型与数据对象 第二篇:底层逻辑篇——数据类型的分类体系与底层存储原理
运维·开发语言·学习·sap·abap
爱喝水的鱼丶5 天前
SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行
运维·服务器·数据库·学习·sap·abap
爱喝水的鱼丶5 天前
SAP-ABAP:第二篇:实操避坑篇——ABAP Hello World程序创建、语法校验到调试运行全流程指南
运维·服务器·数据库·学习·sap·abap
清风雅雨7 天前
SAP-PP 物料标准成本发布异常不能生产报工CKMLPP改表解决方案
sap
爱喝水的鱼丶9 天前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载) 第三篇:ADT常用开发插件与个性化配置教程
数据库·学习·sap·abap
爱喝水的鱼丶9 天前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载) 第二篇:ADT客户端完整安装与初始配置教程
运维·开发语言·学习·sap·abap
爱喝水的鱼丶9 天前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载)第四篇:ADT连接故障排查与环境迁移教程
运维·开发语言·数据库·学习·sap·abap