问题背景:
有客户提出需求,采购订单在触发审批后,如果在审批中的状态,希望采购订单不可被更改。
解决方案:
尝试通过自定义逻辑,写一个 BAdI 来满足需求。
分析步骤:
1. 首先,我们需要在 SAP S/4HANA Cloud 系统的应用 – 自定义逻辑里,新增增强实施。根据业务场景,选择下图中的业务上下文以及业务加载项描述,填写好实施描述以及实施标识。
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. 尝试编辑一个处于审批中状态的订单,进入编辑后,左下角会显示一条错误信息,无法对该订单的修改进行保存。
结语
如果您对本文有任何的建议和想法,欢迎在评论区提出,期待与您一起交流。