一
问题描述
SAP 创建采购订单时(分为前台界面创建或后台BAPI创建). 特定单位的商品(比如单位EA),输入小数后,系统会自动取整或舍入特定小数位. (取决于单位的小数位长定义)
对于EA这种单位. 没有设定小数位(下图是EA单位和KG单价的比较).
在PO尝试输入小数时,第一次系统会自动舍入,同时报一个警告消息
再次输入小数, 系统接受输入的小数
使用BAPI创建时, 系统自动舍入(同时BAPI RETURN会返回一个警告).
调整消息属性并不能解决系统自动舍入的问题.(配置表T160M)
如果调整消息属性为报错,则系统不自动舍入, 但是会报错
如果仅输入小数, 可能会出现系统舍入为0的情况, 创建报数量或金额错误.
退货采购订单不会自动舍入
同时SO相关单据没有这种自动舍入
二
问题分析
通过消息号 ME 386 跟踪底层逻辑. 找到系统发出消息的位置. 同时发现,系统替换前会判断 retpo 为空才替换. 所以退货订单不会自动舍入. 同时系统会判断 kz_no_take_over = 'X' 才会替换.
进一步追查内表 GT_ROUND_MEM 的写入逻辑.系统在调用 MD_SINGLE_ROUNDING 后.
根据消息的类型 为报错. 设定了kz_no_take_over = 'X' (报错则不替换数量, 修改调整错误类型为警告,则会替换数量)
进入函数MD_SINGLE_ROUNDING
但是这个增强点似乎不太合适. 因为这里缺少了采购订单的相关信息.
三
问题解决
最终决定在LMEPOF65
FORM MEPO_ITEM_FILL_ROUND 开头增强, 根据自定义配置表ZTBC065判断是否跳过后续的舍入逻辑.
增强后, 系统后续会报错误消息ME 678 .这个消息可以通过配置消息类型,修改为警告(配置表T160M)解决.
四
总结
解决方案有两个: 最简单的是调整单位的小数位长.但如果业务只是在特定单据中希望EA单位输入的小数不会自动舍入. 这样就需要启用增强方案.
修改单位的小数位长影响较大. 增强解决则只是针对PO的舍入问题解决,针对性比较强. 可以根据项目的具体情况采用.
通过这个问题的解决可以发现, 很多业务逻辑及增强点都可以通过跟踪系统的报错消息获取.
实际项目中,业务顾问掌握一些DEBUG技能有助于理解系统逻辑,找出标准配置点及找到合适的增强点.
THE
END
约定
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)
公众号 : syjf1976_abap
ABAP开发技巧
微信号 : 392077
请微信联系管理员:
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论