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

问题背景:


有客户提出需求,在为采购订单预制发票时,进行检查,对于采购订单行项目 Account Assignment Category (科目分配类别) Y(3rd Party W/O SN), 如果 Deliv. Compl. (交货已完成) 未被勾选,此时用 MIRO 开票需要提示报错:收货未完成,不能开票。

本文即对该需求展开分析,探索解决方案。


如果没有果 Deliv. Compl. 未被勾选,此时用 MIRO 开票需要提示报错



解决方案:


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

分析步骤:


1. 以前也帮助处理过客户的一个关于开票的需求,因此我们这次需要用到的增强逻辑和之前的一样。参见这篇 Blog :在 SAP S/4HANA Cloud 中通过自定义逻辑检查预制发票的付款条件与供应商主数据中的付款条件是否一致 | SAP Blogs

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


新增增强措施


2. 在自定义逻辑新增增强实施完成后,我们需要找到一个字段来获取采购订单的 Account Assignment Category Deliv. Compl. ,我们需要在 CDS Views 里进行查找和检索。I_PURCHASEORDERITEMAPI01 这个 CDS View 里有助于检索采购订单行项目的详细信息,其中我们可以找到字段 ACCOUNTASSIGNMENTCATEGORY ,这个字段即 Account Assignment Category ,我们要判断这个字段是不是 Y 。字段 ISCOMPLETELYDELIVERD ,这个字段就代表了 MIRO 中的 Deliv. Compl. 字段。

3. 目前需要作为判断条件的字段都已经找到了,但我们还需要作一个主数据和 CDS View 里对应数据的匹配。明显我们可以使用 I_PURCHASEORDERITEMAPI01 里的 PURCHASEORDER 和 PURCHASEORDERITEM 字段。在该 BAdI 里,对应的这两个字段存在表 ITEMSWITHPOREFERENCE 里,所以我们需要使用 loop 循环从表中读取 PURCHASEORDER 和 PURCHASEORDERITEM 。再通过语句判断两对字段对应相等,即能完成数据的匹配。

同时,正如我之前的文章里提到的,在 BAdI 给定的示例代码里,我们能发现有语句可以对触发 BAdI 的行为进行限制,根据我们的需要我们需要添加下面的语句限制 BAdI 仅在预制发票时触发,而不影响其他流程:

Park: if_ex_mrm_check_invoice_cloud=>c_Action_Park ”

4. 根据以上分析过程,实现 BAdI ,具体代码如下。
loop at ITEMSWITHPOREFERENCE REFERENCE INTO DATA(po_item).
if action = if_ex_mrm_check_invoice_cloud=>c_Action_Park.
if po_item->PURCHASEORDER IS NOT INITIAL.
select single * from I_PURCHASEORDERITEMAPI01 with privileged access
where purchaseorder = @po_item->PURCHASEORDER and purchaseorderitem = @po_item->PURCHASEORDERITEM
into @data(Is_PO) .
if Is_PO-accountassignmentcategory = 'Y' and Is_PO-ISCOMPLETELYDELIVERED = ''.
append value #( messagetype = 'E' messageid = 'MRM_BADI_CLOUD' messagenumber = '001' messagevariable1 = '收货未完成,不能开票。' ) to messages.
endif.
endif.
endif.
endloop.

5. 我们首先进入应用 - 显示采购订单,查看我们要开票的采购订单信息。可以看到这张采购订单科目分配类别Y ,且未完成交货,应该限制开票。


科目分配类别是Y



交货已完成未被勾选


6. 我们对这个订单进行预制发票操作。进入应用 – 预制供应商发票,输入需要预制发票的采购订单号,准备预制发票。


进入应用 – 预制供应商发票


7. 点击保存预制凭证,无法保存成功,点击消息,可以看到日志里的错误消息。


触发 BAdI 无法保存



结语:


通过阅读本文以及之前写过的一篇相似场景的 Blog ,希望您已知晓在为采购订单预制发票时,如何通过自定义逻辑来进行一些限制。

关注以下链接可以看到更多有关 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


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