EXIT_SAPLMEREQ_005 и BADI ME_PROCESS_REQ_CUST вызываются последовательно из метода process_user_exit класса lcl_req_item.
Code:
METHOD process_user_exit.
DATA: l_full_check TYPE syst-calld,
l_item_has_errors TYPE syst-calld,
ls_data_new TYPE mereq_item,
ls_data_old TYPE mereq_item,
ls_data_persistent TYPE mereq_item,
lt_cust_messages TYPE mereq_t_bapiret2,
l_badi_recheck TYPE sy-calld,
l_ce_recheck TYPE sy-calld,
l_recheck TYPE sy-calld,
ls_message LIKE LINE OF lt_cust_messages,
l_msgobj TYPE REF TO if_message_obj_mm,
l_msg_hdler TYPE REF TO cl_message_handler_mm,
l_dummy(1) TYPE x,
l_rc TYPE sy-subrc.
*
* clear bit_broken_rules for the user-exit
*
SET BIT my_offset_user_exit_005 OF
me->my_state->broken_rules TO 0.
IF sy-subrc NE 0.
DO.
CONCATENATE me->my_state->broken_rules l_dummy
INTO me->my_state->broken_rules IN BYTE MODE. "unicode
SET BIT my_offset_user_exit_005 OF
me->my_state->broken_rules TO 0.
IF sy-subrc IS INITIAL.
EXIT. "from do
ENDIF.
ENDDO.
ENDIF.
*
* remove & set business object, context
*
CALL METHOD cl_message_handler_mm=>get_handler
IMPORTING
ex_handler = l_msg_hdler.
l_msgobj ?= im_context->model.
CALL METHOD l_msg_hdler->remove_by_bo
EXPORTING
im_business_obj = l_msgobj
im_context = my_offset_user_exit_005
im_include_child_objects = mmpur_no.
CALL METHOD cl_message_mm=>set_current_business_obj
EXPORTING
im_business_obj = l_msgobj.
CALL METHOD cl_message_mm=>set_current_context(
my_offset_user_exit_005 ).
IF im_context->scope EQ mmpur_scope_full.
l_full_check = 'X'.
ENDIF.
IF im_success = mmpur_no.
l_item_has_errors = 'X'.
ENDIF.
ex_success = mmpur_yes.
ex_recheck = mmpur_no.
MOVE-CORRESPONDING:
me->my_state->item TO ls_data_new,
im_context->item_before_checks->item TO ls_data_old,
my_persistent_eban TO ls_data_persistent.
IF NOT me->my_state->ref_item IS INITIAL.
ls_data_new-ref_banfn =
me->my_state->ref_item->my_state->header->my_state->header-banfn.
ls_data_new-ref_bnfpo =
me->my_state->ref_item->my_state->item-bnfpo.
ENDIF.
* call IBS version of BAdI
CALL FUNCTION 'MEREQBADI_PROCESS_ITEM'
EXPORTING
im_item = me
im_count = my_iteration_count
im_ibs = mmpur_yes
im_cust = mmpur_no
im_ref_item = me->my_state->ref_item
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF NOT sy-subrc IS INITIAL.
l_rc = sy-subrc.
ENDIF.
CALL METHOD set_firewall( mmpur_yes ).
*- BAdI ME_PROCESS_REQ_CUST-----------------------------------------*
CALL FUNCTION 'MEREQBADI_PROCESS_ITEM'
EXPORTING
im_item = me
im_count = my_iteration_count
im_ibs = mmpur_no
im_cust = mmpur_yes
im_ref_item = me->my_state->ref_item
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF NOT sy-subrc IS INITIAL.
l_rc = sy-subrc.
ENDIF.
IF me->my_state->input_buffer_changed EQ mmpur_yes.
l_badi_recheck = mmpur_yes.
ENDIF.
CALL CUSTOMER-FUNCTION '005'
EXPORTING
im_req_item = me
im_data_new = ls_data_new
im_data_old = ls_data_old
im_data_persistent = ls_data_persistent
im_full_check = l_full_check
im_item_has_errors = l_item_has_errors
IMPORTING
ex_messages = lt_cust_messages
ex_recheck_item = l_ce_recheck
EXCEPTIONS
error_message = 1
OTHERS = 0.
IF NOT sy-subrc IS INITIAL.
l_rc = sy-subrc.
ENDIF.
CALL METHOD set_firewall( mmpur_no ).
IF l_ce_recheck EQ mmpur_yes OR l_badi_recheck EQ mmpur_yes.
l_recheck = mmpur_yes.
ENDIF.
IF NOT l_rc IS INITIAL.
mmpur_metafield mmmfd_item_userexit.
*
* customer function triggered a message, store it in
* the log and do nothing
*
mmpur_message_forced sy-msgty sy-msgid sy-msgno
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ex_success = mmpur_no.
ELSEIF sy-subrc IS INITIAL AND
NOT l_recheck IS INITIAL.
ex_recheck = mmpur_yes. "recheck !!!
ENDIF.
LOOP AT lt_cust_messages INTO ls_message.
mmpur_message_forced ls_message-type ls_message-id
ls_message-number
ls_message-message_v1
ls_message-message_v2
ls_message-message_v3
ls_message-message_v4.
IF ls_message-type EQ 'A' OR
ls_message-type EQ 'E'.
ex_success = mmpur_no.
ENDIF.
ENDLOOP.
*
* set bit_broken_rules for the user-exit in case of error
*
IF ex_success EQ mmpur_no.
SET BIT my_offset_user_exit_005 OF
me->my_state->broken_rules.
ENDIF.
ENDMETHOD. "lcl_req_item
Как видно из кода - для ошибок задается контекст
Code:
CALL METHOD cl_message_mm=>set_current_business_obj
EXPORTING
im_business_obj = l_msgobj.
CALL METHOD cl_message_mm=>set_current_context(
my_offset_user_exit_005 ).
и вызывается
Code:
mmpur_message_forced
Попробуйте повторить логику для нужной позиции.