有客户提出需求,在销售订单出库交货过账后,不允许修改销售订单的价格。因为如果交货过账后修改了订单中的价格,在开票的初始界面,金额还是更改之前的价格,只有模拟开票后才会更新,这对于财务的一些计算会带来困难。本文即对该问题展开分析,探索解决方案。
解决方案:
尝试通过自定义逻辑,写一个 BAdI 来满足需求。
分析步骤:
1. 首先,我们需要在 SAP S/4HANA Cloud 系统的应用 – 自定义逻辑里,新建增强实施。根据业务场景,选择下图中的业务上下文以及业务加载项描述,填写好实施描述以及实施标识。
2. 在自定义逻辑里根据本问题涉及业务上下文完成新建增强实施后,我们需要找到字段获取销售订单的价格。此外,还需要获取销售订单的发货状态和过账状态,作为判断条件帮助我们判别一个销售订单是否已经出库交货过账。我们需要在 CDS Views 里进行查找和检索。I_SALESDOCUMENT 这个 CDS View 包含了销售订单的字段信息,查看检索字段描述,字段 TOTALNETAMOUNT 可以帮助我们获取销售订单的净值。同时在该 CDS View 里,字段 OVERALLTOTALDELIVERYSTATUS 代表总体交货状态。如图所示,该字段为 A 代表未交货,为 C 代表已全部交货。
我们还需要获取销售订单的过账状态。当销售订单处于可过账发货状态时,字段 GOODSMOVEMENTSTATUS 即货物移动状态的值为 A 。在完成发货过账后,该字段的值变为 C 。因此,我们在 I_DELIVERYDOCUMENTITEM 这个 CDS View 里使用该字段来获取销售订单对应的过账状态。
现在我们已经找到了针对该问题的 BAdI 所需要用到的字段,接下来就是要确保我们在 CDS Views 里取到对应销售订单字段的值。在 I_DELIVERYDOCUMENTITEM 里字段 REFERENCESDDOCUMENT 表示参考凭证的凭证编号,即出库单对应的销售订单号。因此,我们在调取 I_DELIVERYDOCUMENTITEM 中数据时的匹配条件即是” REFERENCESDDOCUMENT = SALESDOCUMENT-SALESDOCUMENT “,这样就能正确取到销售订单对应出库单的字段数据。
3. 根据以上分析过程,实现 BAdI ,具体代码如下。
if SALESDOCUMENT-OVERALLTOTALDELIVERYSTATUS = 'C'.
select single * from I_SALESDOCUMENT with privileged access
where SALESDOCUMENT = @SALESDOCUMENT-SALESDOCUMENT
into @data(ls_salesdoc_before_change) .
select single * from I_DELIVERYDOCUMENTITEM with privileged access
where REFERENCESDDOCUMENT = @SALESDOCUMENT-SALESDOCUMENT
into @data(ls_deliverydoc) .
if ls_deliverydoc-GOODSMOVEMENTSTATUS = 'C'.
if salesdocument-totalnetamount ne ls_salesdoc_before_change-totalnetamount.
append value #( messagetype = 'E' messagetext = '销售订单已经出库交货过账,不允许修改价格。' ) to messages.
endif.
endif.
endif.
4. 我们尝试对一个已完成交货过账的销售订单进行价格的修改。修改金额,点击保存,弹窗提示无法保存销售凭证。
同时,左下角也会出现错误消息的提醒。
5. 返回检查销售订单日志查看错误消息,消息文本显示“销售订单已经出库交货过账,不允许修改价格。”
结语:
通过阅读本文,希望您已知晓如何通过自定义逻辑来限制已交货过账的销售订单进行价格的修改。此外,在采购模块我也对相似的问题进行过分析解答,欢迎您了解阅读:在 SAP S/4HANA Cloud 中通过自定义逻辑限制收货后的采购订单进行价格的修改
关注以下链接可以看到更多有关 SAP S/4HANA Cloud 销售相关的问题:All Questions in SAP S/4HANA Cloud for Sales | SAP Community
您也可以通过后面的链接阅读更多有关 SAP S/4HANA Cloud 销售的博文:SAP S/4HANA Cloud for Sales | SAP | SAP Blogs
如果您对本文有任何的建议和想法,欢迎在评论区提出,期待与您一起交流。如果本文对您有任何帮助,欢迎您关注我的个人账号,期待我们在下一篇博文再见!