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
237

问题背景:

有客户提出需求,在修改采购申请时,如果这个采购申请已经有被采购订单参考,则不允许修改这个采购申请。本文即对该问题展开分析,探索解决方案。

解决方案:

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

分析步骤:

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

业务上下文:MM_PURREQN_ITEM

业务加载项描述:检查采购申请项目

2. 自定义逻辑新增增强实施完成后,我们开始分析问题。根据问题,我们需要限制两个条件。条件一,采购申请处于被编辑而非被创建。条件二,被编辑的采购申请是否有被采购订单参考。我们需要在 CDS Views 里进行查找和检索。对于条件一,我们找到 CDS View I_PurchaseRequisitionItemAPI01。我们根据 BAdI 的 importing parameters 里提供的字段 purchaserequisitionpurchaserequisitionitem 在该 CDS View 中定位当前采购申请。如果在这个 CDS View 里检索结果不为空,则说明当前采购申请已被创建。对于条件二,我们找到 CDS View I_PurchaseOrderItemAPI01 。同理,使用 BAdI 的 importing parameters 里提供的字段 purchaserequisitionpurchaserequisitionitem 在 I_PurchaseOrderItemAPI01 中检索。如果在这个 CDS View 里检索结果不为空,则说明存在采购订单参考了当前采购申请,我们需要返回一条 Error Message 来阻止业务流程。

3. 根据以上分析过程,实现 BAdI ,具体代码如下。

 

    DATA:
      lv_po_exists       TYPE abap_bool,
      lo_message         LIKE LINE OF messages,
      ls_item            TYPE mmpur_s_pr_item_import,
      ls_po_item         TYPE I_PurchaseOrderItemAPI01.

    LOOP AT purchaserequisitionitem_table INTO ls_item.

      DATA(purchaserequisition_item_guid) = ls_item-purchaserequisitionitem.

      SELECT SINGLE *
        FROM I_PurchaseRequisitionItemAPI01
        WHERE PurchaseRequisition = @PURCHASEREQUISITION-purchaserequisition
          AND PurchaseRequisitionItem = @LS_item-purchaserequisitionitem
        INTO @DATA(lv_pr_item).

      IF lv_pr_item IS NOT INITIAL.

        SELECT SINGLE *
          FROM I_PurchaseOrderItemAPI01
          WHERE PurchaseRequisition = @PURCHASEREQUISITION-purchaserequisition
            AND PurchaseRequisitionItem = @LV_pr_item-purchaserequisitionitem
          INTO @LS_po_item.

        IF sy-subrc = 0.
          lv_po_exists = abap_true.
        ENDIF.

      ENDIF.

      IF lv_po_exists = abap_true.
        lo_message-messagetype = 'E'.
        lo_message-messagevariable1 = 'This PR cannot be edited.'.
        APPEND lo_message TO messages.
        purchaserequisitionhaserror = abap_true.
        RETURN.
      ENDIF.

    ENDLOOP.

 

4. 我们来校验 BAdI 是否生效。已经在系统中创建了两个采购申请,1000164010001641 ,参考 10001640 创建了采购订单 4500000516 。Snipaste_2024-11-06_16-29-49.png

尝试对两个采购申请进行修改,结果如图所示。采购申请 10001640 无法被修改,有错误信息产生。采购申请 10001641 可以被修改。说明 BAdI 生效。

Snipaste_2024-11-06_16-27-45.png

 

Snipaste_2024-11-06_16-28-48.png

 

结语:

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

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

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