ABAP ME_PROCESS_PO_CUST消息异常

前言

业务顾问要求根据物料组校验增强字段必填,一开始放在行项目的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

### 关于 ME_CONFIRMATION_UPDATE 的技术实现 尽管未提供直接关于 `ME_CONFIRMATION_UPDATE` 的具体引用,但从已有的引用内容可以推测其可能的技术背景和技术实现逻辑。以下是基于现有引用和 SAP 领域专业知识的分析。 #### 可能的功能范围 `ME_CONFIRMATION_UPDATE` 很可能是用于更新采购确认相关数据的一个功能模块或增强点。它通常涉及对采购订单 (Purchase Order, PO) 数据的操作以及与外部系统的交互。此类操作常见于 SAP MM 和 SD 模块中的集成场景。 --- #### 技术实现思路 1. **数据结构定义** 在处理采购确认的过程中,需要先定义所需的数据表及其字段。例如,在引用[1]中提到的变量声明部分展示了如何定义工作区并初始化数据对象: ```abap DATA: WA_XKOMDLGN LIKE LINE OF XKOMDLGN. ``` 这里通过 `DATA` 定义了一个局部变量 `WA_XKOMDLGN` 来存储单条记录的内容[^1]。 2. **循环遍历与条件筛选** 对目标内部表进行逐行扫描,并利用数据库查询语句获取缺失的信息。以下是一个典型的 ABAP 实现片段,展示如何在循环中动态修改表格内容: ```abap LOOP AT T_KOM INTO WA_XKOMDLGN. SELECT SINGLE MATNR INTO WA_XKOMDLGN-MATNR FROM EKPO WHERE EBELN EQ WA_XKOMDLGN-VGBEL AND EBELP EQ WA_XKOMDLGN-VGPOS. MODIFY T_KOM FROM WA_XKOMDLGN. ENDLOOP. ``` 上述代码实现了从 `EKPO` 表中提取物料编号 (`MATNR`) 并将其赋值给当前的工作区内存单元,随后调用 `MODIFY` 更新原始表项[^1]。 3. **函数模块调用** 如果存在特定业务需求,则可以通过自定义开发或者重写标准函数来满足扩展要求。比如引用[2]提到了创建交货凭证时遇到的问题及解决方案路径——即借助增强点完成额外属性填充的任务: ```abap CALL FUNCTION 'BAPI_BB_INBOUND_DELIVERY_CREATE' EXPORTING ... TABLES ... ENDFUNCTION. ``` 此外还提及到另一个潜在关联点 `LE_SHP_GN_DLV_CREATE`,这表明该过程不仅限于简单的读取/写入动作,而是涉及到更复杂的端到端流程控制机制[^2]。 4. **定制化方法覆盖** 当前版本的标准程序无法完全适配特殊企业规则的情况下,允许开发者编写个性化的算法替代默认行为。如下所示是从引用[3]摘录的一段示例代码,演示了针对不同事务码分别设置项目参数的过程: ```abap METHOD IF_EX_ME_PO_PRICING_CUST~PROCESS_KOMP. IF sy-tcode = 'ME21N' OR sy-tcode = 'ME22N'. CLEAR: ch_komp-ZPS_PSP_PNR. DATA: ls_im_knt TYPE LINE OF mm_pur_ekknu. LOOP AT im_knt INTO ls_im_knt WHERE ebelp = ch_komp-KPOSN. ch_komp-zPS_PSP_PNR = ls_im_knt-PS_PSP_PNR. ENDLOOP. ENDIF. ENDMETHOD. ``` 以上代码片段体现了灵活调整定价策略的能力,同时也反映了良好的封装性和可维护性的设计原则[^3]。 5. **机器学习优化建议(非核心但值得关注)** 虽然主要讨论的是传统 ERP 开发模式下的实践案例,但如果考虑引入智能化手段提升效率的话,那么可以从引用[4]获得启发,尝试探索诸如梯度下降法、牛顿法或者其他数值计算技巧的应用价值。不过需要注意的是这类高级特性一般适用于预测建模而非单纯的交易型应用场合[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值