我试图阻止用户通过BAdI实现保存采购请购单,检查行和账户。我抛出的错误信息并没有停止保存过程,而且我找不到一种方法来使行无效,就像在PO中一样。所以,可以保存一个包含错误数据的PR。
我扩展了采购申购BAdI,并实现了 IF_EX_ME_PROCESS_REQ_CUST
在 ZCL_IM_EI_PROCESS_REQ_CUST
. 在方法上 PROCESS_ITEM
和 PROCESS_ACCOUNT
我可以在账户和项目上访问几个进口。但与PO不同的是,我找不到使一个项目无效的方法。所用的类都没有提供这个功能。
在BAPI中,我可以访问的PR项目对象是属于接口 IF_PURCHASE_REQUISITION_ITEM
,作为一个本地类在函数pool中实现 MEREQ
. 这个接口有一个方法 IS_VALID
但并不提供任何无效的东西,相比之下,PO项目接口有一个 INVALIDATE
方法。
编辑
经过更多的调试,似乎是通过成员的失效 MY_STATE-BROKEN_RULES
本地班 MEREQ/LCL_REQ_ITEM
. 任何想法,我可以访问这个?
正如@vwegert所建议的那样,诀窍是使用了? CHECK
方法。它在PR的验证方法中被调用。
我的解决方案是在PR上添加一个成员属性 FAILED
类型 MMPUR_BOOL
. 在我的所有其他方法中,我可以在失败时设置这个标志。
IF your condition fails
me->failed = mmpur_yes.
ENDIF.
最后,我的 CHECK
方法只包含
ch_failed = me->failed.
ch_failed
被带回功能模块 MEREQBADI_CHECK
这又被用于 is_valid
方法的PR类。这将使PR无效,并触发你看到的标准错误的消息框。自定义错误信息在下图中,保存时。
我使用了 MESSAGE 'My message' TYPE 'E'
方法中的'PROCESS_HEADER'。
METHOD IF_EX_ME_PROCESS_REQ_CUST~PROCESS_HEADER.
DATA : it_items TYPE mmpur_requisition_items,
wa_item TYPE mmpur_requisition_item,
wa_item_data TYPE mereq_item,
wa_header_data type mereq_header.
it_items = im_header->GET_ITEMS( ). " Purchase requisition positions
wa_header_data = im_header->GET_DATA( ). " Header info
LOOP AT it_items INTO wa_item.
CLEAR wa_item_data.
wa_item_data = wa_item-item->GET_DATA( ).
IF wa_item_data-loekz IS NOT INITIAL.
MESSAGE 'Raise error' TYPE 'E'.
ENDIF.
ENDLOOP.
ENDMETHOD.
希望能帮到你。