Skip to Content
Technical Articles
Author's profile photo Zhehui Xia

在SAP S/4HANA Cloud中通过自定义逻辑实现审批中的采购订单不可更改

问题背景:

有客户提出需求,采购订单在触发审批后,如果在审批中的状态,希望采购订单不可被更改。

解决方案:

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

分析步骤:

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

%u65B0%u589E%u589E%u5F3A%u63AA%u65BD

新增增强措施

2. 在自定义逻辑新增增强实施完成后,我们需要找到一个字段来获取采购订单的审批状态,需要在 CDS Views 里找到这样的一个字段。I_PurchaseOrderAPI01 这个 CDS View 包含了采购订单的基本信息。根据字段描述,有两个字段可以帮助我们检查采购订单的审批状态。分别是 ReleaseIsNotCompleted PurchasingProcessingStatus

ReleaseIsNotCompleted 字段用来表示“审批尚未完全生效”,有两种情况,为空或者为“X”。但前者表示的情况包括订单未审批、审批完成,后者表示的情况包括订单审批中、审批不通过等。所以单独使用这个字段无法判断订单是否处于审批中。 PurchasingProcessingStatus 字段表示“采购凭证处理状态”,类型为 CHAR ,长度为2,通过一个两位的状态码来标识采购订单。标识码有如下几种:

02未审批

03审批中

05审批完成

08审批不通过

因此,我们可以在 BAdI 里使用 ReleaseIsNotCompleted 和 PurchasingProcessingStatus 这两个字段来共同判断采购订单的审批状态,进而实现需求。

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

if purchaseorder-purchasingprocessingstatus is not initial or purchaseorder-purchasingprocessingstatus is initial.
  select single * from I_PurchaseOrderAPI01 with privileged access
    where purchaseorder = @purchaseorder-purchaseorder
    into @data(Is_status_approval) .
  if Is_status_approval-purchasingprocessingstatus EQ '03' and Is_status_approval-releaseisnotcompleted EQ 'X'.
    append value #(  messagetype = 'E' messagevariable1 = '正在审批中,无法更改。' ) to messages.
  endif.
endif.

4. 尝试编辑一个处于审批中状态的订单,进入编辑后,左下角会显示一条错误信息,无法对该订单的修改进行保存。

%u5F53%u524D%u8BA2%u5355%u5904%u4E8E%u5BA1%u6279%u4E2D

当前订单处于审批中

%u5BA1%u6279%u4E2D%u7684%u8BA2%u5355%u8FDB%u5165%u7F16%u8F91%u540E%u65E0%u6CD5%u4FDD%u5B58

审批中的订单进入编辑后无法保存

结语

如果您对本文有任何的建议和想法,欢迎在评论区提出,期待与您一起交流。

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.