Enterprise Resource Planning Blogs by SAP
Get insights and updates about cloud ERP and RISE with SAP, SAP S/4HANA and SAP S/4HANA Cloud, and more enterprise management capabilities with SAP blog posts.
cancel
Showing results for 
Search instead for 
Did you mean: 
Zhehui_Xia
Product and Topic Expert
Product and Topic Expert
0 Kudos
1,190

问题背景:


有客户提出需求,通过自定义的增强,达到采购订单收货后就不允许更改价格。本文即对该问题展开分析,探索解决方案。

解决方案:


尝试通过自定义逻辑,写一个 BAdI 来满足需求。

分析步骤:


1. 首先,我们需要在 SAP S/4HANA Cloud 系统的应用 – 自定义逻辑里,新建增强实施。根据业务场景,选择下图中的业务上下文以及业务加载项描述,填写好实施描述以及实施标识


新增增强措施


2. 在自定义逻辑里根据本问题涉及业务上下文完成新建增强实施后,我们需要找到字段获取采购订单的价格。此外,根据问题中的需求,我们还需要获取采购订单的发货状态

通过在 CDS Views 里的检索,没有能够找到一个字段可以帮助我们直接获取采购订单的发货状态。但是,我们可以通过 I_PURCHASEORDERHISTORYAPI01 这个 CDS View 来间接帮助我们判断一个采购订单是否已经发货。如果一张采购订单有 item 已经发货,该 CDS View 里会对该采购订单的对应的 item 生成一条记录。那么只要我们使用采购订单的单号在该 CDS View 里进行检索,如果返回的记录数不为 0 ,则代表采购订单已经有发货。那么,我们可以写出我们关于采购条件发货状态的判断语句。
    select count(*) from I_PurchaseOrderHistoryAPI01 with privileged access
where PURCHASEORDER = @PURCHASEORDER-PURCHASEORDER
into @data(ls_PO_NUM) .
if ls_PO_NUM ne '0'.

...

endif.

接下来就是获取价格,以及完成数据的匹配。由于采购订单的价格存储在行项目里,而相关增强针对的业务上下文是采购凭证,因此我们需要使用 loop 语句循环读取 PURCHASEORDERITEM 表,从中获取采购订单行项目的价格,对应字段为 NETAMOUNT 。与销售订单不同的是,并没有一个字段可以表示整个采购订单的净值,我们只能获得每个 item 的净值。因此我们在构建判断条件进行数据匹配时要格外注意,不光是要对 PURCHASEORDER 进行判断,也要对 PURCHASEORDERITEM 进行判断,否则对于存在多个 item 的采购订单,数据可能会匹配错误。

3. 根据以上分析过程,实现 BAdI ,具体代码如下。
    select count(*) from I_PurchaseOrderHistoryAPI01 with privileged access
where PURCHASEORDER = @PURCHASEORDER-PURCHASEORDER
into @data(ls_PO_NUM) .
if ls_PO_NUM ne '0'.
loop at PURCHASEORDERITEMS REFERENCE INTO DATA(i_poitem).
if i_poitem->PURCHASEORDER = PURCHASEORDER-PURCHASEORDER.
select single * from I_PURCHASEORDERITEMAPI01
where PURCHASEORDER = @PURCHASEORDER-PURCHASEORDER and PURCHASEORDERITEM = @i_poitem->PURCHASEORDERITEM
into @data(ls_PO_COMPARE) .
if i_poitem->NETAMOUNT ne ls_PO_COMPARE-NETAMOUNT.
append value #( messagetype = 'E' messagevariable1 = '采购订单已发货,无法修改价格。' ) to messages.
endif.
endif.
endloop.
endif.

4. 如图所示,我们取一张已经发货的采购订单 4500000079 。


采购订单 4500000079 ,已部分发货


尝试对该订单进行价格的修改。修改金额,点击保存,出现错误消息的弹窗,提示我们无法保存修改。


错误消息提示“采购订单已发货,无法修改价格。”


5. 如图所示,我们取一张未发货的采购订单 4500000077 。


采购订单 4500000077 ,未发货


尝试对该订单进行价格的修改。修改金额,点击保存,未出现任何弹窗,保存成功。


无任何错误消息提示,保存成功



结语:


通过阅读本文,希望您已知晓如何通过自定义逻辑来限制收货后的采购订单进行价格的修改。此外,在销售模块我也对相似的问题进行过分析解答,欢迎您了解阅读:在 SAP S/4HANA Cloud 中通过自定义逻辑限制已交货过账的销售订单进行价格的修改

关注以下链接可以看到更多有关 SAP S/4HANA Cloud 采购相关的问题:All Questions in SAP S/4HANA Cloud for Sourcing and Procurement | SAP Community

您也可以通过后面的链接阅读更多有关 SAP S/4HANA Cloud 采购的博文:SAP S/4HANA Cloud for Sourcing and Procurement | SAP | SAP Blogs

如果您对本文有任何的建议和想法,欢迎在评论区提出,期待与您一起交流。如果本文对您有任何帮助,欢迎您关注我的个人账号,期待我们在下一篇博文再见!
2 Comments