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: 
Summer23
Product and Topic Expert
Product and Topic Expert

问题背景:


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

解决方案:


尝试通过自定义逻辑,写一个 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. 尝试编辑一个处于审批中状态的订单,进入编辑后,左下角会显示一条错误信息,无法对该订单的修改进行保存。


当前订单处于审批中



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



结语:


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