我试图阻止用户通过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
,实现为函数池MEREQ
中的本地类。此接口具有方法IS_VALID
但不提供任何无效的内容,与具有INVALIDATE
方法的PO项目界面相反。
修改
经过更多调试后,似乎失效是通过本地班级MY_STATE-BROKEN_RULES
的成员MEREQ/LCL_REQ_ITEM
完成的。知道我怎么能访问这个吗?
答案 0 :(得分:1)
正如@vwegert建议的那样,诀窍是使用CHECK
方法。它会在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类的{{1}}方法。这会使PR无效并触发您看到的带有标准错误的消息框。保存时,下图中的自定义错误消息。
答案 1 :(得分:0)
我已经在' PROCESS_HEADER'中使用MESSAGE 'My message' TYPE 'E'
完成了该操作。方法
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.
希望它有所帮助。