问题背景:
有客户提出需求,采购订单在触发审批后,如果在审批中的状态,希望采购订单不可被更改。
解决方案:
尝试通过自定义逻辑,写一个 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 这两个字段来共同判断采购订单的审批状态,进而实现需求。
同时,为了避免在创建采购订单时触发该 BAdI 导致审批工作流处理时出错,需要加上语句进行限制。可以使用该语句。
if purchaseorder-purchaseorder IS NOT INITIAL.
...
3. 根据以上分析过程,实现 BAdI ,具体代码如下。
if purchaseorder-purchaseorder IS NOT 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. 尝试编辑一个处于审批中状态的订单,进入编辑后,左下角会显示一条错误信息,无法对该订单的修改进行保存。

当前订单处于审批中

审批中的订单进入编辑后无法保存
结语:
如果您对本文有任何的建议和想法,欢迎在评论区提出,期待与您一起交流。