Technical Articles
How to add a customer-specific check for a purchase order
When we have a customer requirement to implement checks for PO data before saving, we can implement BADI ME_PROCESS_PO_CUST. The check for the fields can be implemented in methods:
- PROCESS_* (example: PROCESS_ITEM Processing of Item Data )
- CHECK Closing Check
To raise an error message we use macros. To make them available, specify in the beginning the following include mm_messages_mac.
After the logical condition when the error should be raised:
- Set the context ( a freely selected number from the range 900-999): mmpur_context &Context.
- Set the business object: mmpur_business_obj_id &Object ID.
- Set the error message from the message class with variables ( message type, message class, message number, message variables 1-4) : mmpur_message_forced &Message type...
- Invalidate the object: CALL METHOD invalidate( ).
- Set the check failed in case of Closing Check : ch_failed = abap_true.
If the logical condition, defines that we have no error message, the error message must be removed from the context
- mmpur_remove_msg_by_context &Object ID &Context .
Below you can find example for the closing check of a purchase order.
1) Example of raising an error message at the header level
IF ls_header-vsart NE 'Z1' AND lv_error EQ abap_true.
mmpur_context 990.
mmpur_business_obj_id ls_header-id.
mmpur_message_forced 'E' 'Z_PO_ERROR' '001' '' '' '' ''.
CALL METHOD im_header->invalidate( ).
ch_failed = abap_true.
ELSE.
mmpur_remove_msg_by_context ls_header-id 990.
ENDIF.
2) Example of raising an error message at the iem level
DATA(lt_items) = im_header->get_items( ).
LOOP AT lt_items INTO DATA(ls_item).
lm_items = ls_item-item.
DATA(ls_mepoitem) = lm_items->get_data( ).
IF ls_mepoitem-vsart NE 'Z1' AND lv_error EQ abap_true.
mmpur_context 991.
mmpur_business_obj_id ls_mepoitem-id.
mmpur_message_forced 'E' 'Z_PO_ERROR' '002' ls_mepoitem-ebelp '' '' ''.
CALL METHOD lm_items->invalidate( ).
ch_failed = abap_true.
ELSE.
mmpur_remove_msg_by_context ls_mepoitem-id 991 .
ENDIF.
ENDLOOP.
Hi Dzmitryi Kharlanau
Once we display any Custom Error message from the Check Method, after correcting the error we are still getting the old messages. Tried deleting the Old messages using Methods from class cl_message_handler_mm.
How to delete custom error message but not delete SAP standard error message in PO badi IF_EX_ME_PROCESS_PO_CUST.
Can you please help here.
Thanks,
Prakash A