0

我试图阻止用户通过 BAdI 实施、检查行和帐户来保存采购申请。我抛出的错误消息不会停止保存过程,而且我找不到使该行无效的方法,就像我在 PO 中所做的那样。因此,可以保存包含错误数据的 PR。

我扩展了采购申请 BAdI 并IF_EX_ME_PROCESS_REQ_CUSTZCL_IM_EI_PROCESS_REQ_CUST. 在方法 中PROCESS_ITEMPROCESS_ACCOUNT我可以访问帐户和项目的多个导入。但与 PO 不同的是,我找不到使项目无效的方法。使用的所有类都没有提供该功能。

我在 BAPI 中可以访问的 PR 项目对象是接口的IF_PURCHASE_REQUISITION_ITEM,在函数池中实现为本地类MEREQ。与具有方法的 PO 项接口相比,此接口具有方法IS_VALID但不提供任何使无效的内容INVALIDATE

编辑

经过更多调试后,似乎失效是通过MY_STATE-BROKEN_RULES本地类的成员完成的MEREQ/LCL_REQ_ITEM。知道如何访问它吗?

4

2 回答 2

1

正如@vwegert 建议的那样,诀窍是使用该CHECK方法。它在 PR 的验证方法中被调用。

我的解决方案是添加FAILEDtype的成员属性MMPUR_BOOL。在我所有的其他方法中,我可以在失败时设置这个标志:

IF your condition fails
  me->failed = mmpur_yes.
ENDIF.

最后,我的CHECK方法只包含

ch_failed = me->failed.

ch_failed被带回功能模块MEREQBADI_CHECK,该模块又用于is_validPR 类的方法。这会使 PR 无效并触发您看到的带有标准错误的消息框。下图中的自定义错误消息,保存时。

在此处输入图像描述

于 2014-06-13T23:08:28.463 回答
0

我已经使用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.

希望能帮助到你。

于 2014-06-13T02:34:10.120 回答