前言
业务顾问要求根据物料组校验增强字段必填,一开始放在行项目的IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM里面做校验,但是如果只修改增强字段,则无法进入该函数
所以最后放到IF_EX_ME_PROCESS_PO_CUST~CHECK里面做检查
问题
使用标准示例代码的消息例程向前台的用户报错,如果第一次检查报错之后,用户第二次将问题修改完再次检查,第一次的报错仍然会出现,源代码如下:
DATA: lv_dummy TYPE c LENGTH 128.
DATA: lo_item TYPE REF TO if_purchase_order_item_mm,
lt_items TYPE purchase_order_items,
ls_mepoitem TYPE mepoitem,
lv_error TYPE c.
lt_items = im_header->get_items( ).
LOOP AT lt_items INTO DATA(ls_items).
ls_mepoitem = ls_items-item->get_data( ).
" 检查逻辑
CASE ls_mepoitem-matkl.
WHEN '2030102'. " 当MATKL=2030102(工业硅半成品)时,“理化指标”、“颗粒度”请检查是否需要输入;
IF ls_mepoitem-zzgf_lhzb_po IS INITIAL OR
ls_mepoitem-zzgf_kld_po IS INITIAL .
mmpur_business_obj_id ls_mepoitem-id.
mmpur_context MMCNT_USER_EXIT.
MESSAGE w008(zmm001) WITH ls_mepoitem-ebelp INTO lv_dummy.
mmpur_message_forced sy-msgty sy-msgid sy-msgno
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDCASE.
ENDLOOP.
解决方案
用该宏添加到标准消息之后,只能手工才能去掉之前添加的消息,新增如下代码即可
DATA: lv_dummy TYPE c LENGTH 128.
DATA: lo_item TYPE REF TO if_purchase_order_item_mm,
lt_items TYPE purchase_order_items,
ls_mepoitem TYPE mepoitem,
lv_error TYPE c.
DATA: lt_events TYPE mmpur_event_list.
DATA: ls_event TYPE mmpur_event_entry.
DATA: lo_business_object TYPE REF TO if_message_obj_mm.
lt_items = im_header->get_items( ).
LOOP AT lt_items INTO DATA(ls_items).
ls_mepoitem = ls_items-item->get_data( ).
" 检查逻辑
CASE ls_mepoitem-matkl.
WHEN '2030102'. " 当MATKL=2030102(工业硅半成品)时,“理化指标”、“颗粒度”请检查是否需要输入;
IF ls_mepoitem-zzgf_lhzb_po IS INITIAL OR
ls_mepoitem-zzgf_kld_po IS INITIAL .
mmpur_business_obj_id ls_mepoitem-id.
mmpur_context MMCNT_USER_EXIT.
MESSAGE w008(zmm001) WITH ls_mepoitem-ebelp INTO lv_dummy.
mmpur_message_forced sy-msgty sy-msgid sy-msgno
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
*--- 清空消息先找消息ID
CALL METHOD cl_message_handler_mm=>get_handler
IMPORTING
ex_handler = gl_message_handler.
CALL METHOD gl_message_handler->getlist
IMPORTING
ex_events = lt_events.
LOOP AT lt_events INTO ls_event.
*--- check context
IF ls_event-context = mmcnt_user_exit.
*--- remove message
lo_business_object = ls_event-business_obj.
CALL METHOD gl_message_handler->remove_by_bo
EXPORTING
im_business_obj = lo_business_object
im_context = ls_event-context.
ENDIF.
ENDLOOP.
ENDIF.
ENDCASE.
ENDLOOP.
感谢大佬的博客
参考链接:https://blog.csdn.net/qq_41900124/article/details/89919004