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

问题背景:


有客户提出需求,在为采购订单预制发票时,检查供应商主数据的付款条件。如果预制发票的付款条件与供应商主数据中的付款条件不一致,则发送一条错误信息;如果预制发票的付款条件与供应商主数据中的付款条件一致,预制发票可以保存成功。本文即对该问题展开分析,探索解决方案。

解决方案:


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

分析步骤:


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


新增增强措施


2. 在自定义逻辑新增增强实施完成后,我们需要找到一个字段来获取供应商主数据付款条件,我们需要在 CDS Views 里进行查找和检索。I_SupplierCompany 这个 CDS View 包含了我们可以获取供应商的一些字段信息。根据字段描述,字段 paymentterms 可以帮助我们获取供应商的付款条件。

同时我们需要将“该 CDS View 里的 supplier 字段等于预制发票数据的 invoicingparty 字段”作为查询条件,这样才能正确的取到采购订单对应的供应商主数据中的付款条件字段。另外,由于这个 BAdI 在保存发票时都会被触发,为了防止在冲销过程中也触发该 BAdI ,我们可以在判断条件里添加一条对字段 reversedocument 的判断。该字段代表冲销凭证编号,当进行发票预制时,该字段为空值。所以将其也作为一条判断条件添加到 BAdI 里。

如果阅读 BAdI 给定的示例代码,我们也能发现有语句可以对触发 BAdI 的行为进行限制,具体如下:

" Constants for all possible values of parameter ACTION can be found in the following list " "

Post: if_ex_mrm_check_invoice_cloud=>c_Action_Post "

Park: if_ex_mrm_check_invoice_cloud=>c_Action_Park "

Hold: if_ex_mrm_check_invoice_cloud=>c_Action_Hold "

Save as Completed: if_ex_mrm_check_invoice_cloud=>c_Action_Save_As_Completed "

Check: if_ex_mrm_check_invoice_cloud=> c_Action_Check "

Delete: if_ex_mrm_check_invoice_cloud=>c_Action_Delete "

Simulate: if_ex_mrm_check_invoice_cloud=>c_Action_Simulate

因此如果我们添加上面的第二条语句,也能限制 BAdI 仅在预制发票时触发。

3. 根据以上分析过程,实现 BAdI ,具体代码如下。
select single * from i_SupplierCompany with privileged access
where supplier = @headerdata-invoicingparty
into @data(Is_inventory_payment_same) .
if action = if_ex_mrm_check_invoice_cloud=>c_action_park.
if headerdata-paymentterms ne Is_inventory_payment_same-paymentterms and headerdata-reversedocument = ''.
append value #( messagetype = 'E' messageid = 'MRM_BADI_CLOUD' messagenumber = '001' messagevariable1 = '预制发票的付款条件和供应商主数据付款条件不一致。' ) to messages.
endif.
endif.

4. 我们对一个订单进行预制发票操作。进入应用 - 预制供应商发票,输入需要预制发票的采购订单号,在右侧可以看到该订单的供应商。


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


5. 在应用 - 显示供应商里,查询该订单的供应商,确认该供应商主数据里的付款条件0004


确认供应商主数据里的付款条件


6. 返回应用 - 预制供应商发票,修改付款条件为0005,点击保存预制凭证。无法保存成功,点击消息,可以看到日志里的错误消息。


付款条件不一致无法保存


7. 将付款条件改回0004,再点击保存预制凭证。保存成功,左下角会显示创建成功的消息。


付款条件一致保存成功



结语:


通过阅读本文,希望您已知晓在为采购订单预制发票时,如何通过自定义逻辑来检查预制发票的付款条件与供应商主数据中的付款条件是否一致。

关注以下链接可以看到更多有关 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
Massi_Merc
Explorer
0 Kudos
Hello Zhehui,

 

thank you, it's a really nice blog!

Could you please suggest how to implement the check on a specific company code in the badi that you suggested?

 

Thanks a lot
Zhehui_Xia
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Mercuri,

You can just add one line at the top of code, and one line at the bottom of code.
if headerdata-companycode = 'XXXX'.

...

endif.

Best Regards,

Zhehui