• SAP 采购订单行项目屏幕增强(BADI)


    导语:前面写了一个采购订单抬头增强,用SMOD的方式实现的👉【文章链接】,感觉还是比较简单,就尝试了一下用BADI实现行项目的屏幕增强,实现起来比较复杂,有些坎坷,下面分享一下实现过程。

    👉【增强记录清单…】

    前言:SAP给提供了标准的函数组【MEPOBADIEX】,以及实施类【CL_EXM_IM_ME_GUI_PO_CUST】,可以参考函数组进行实现,但是他给的函数组过于全面,导致在实现过程中被稍稍误导。

    MEPOBADIEX】函数组中有8个函数组,分别针对增强在EKPO里的字段,以及通过自建表实现的增强字段,本文实现的过程是增强在EKPO里的字段,所以只需要参考其中以下两个函数即可:

    MEPOBADIEX_POP、MEPOBADIEX_PUSH

    如果是自建表实现增强,就需要八个函数都用了,然后参考实施类进行增强。

    一、增强EKPO表

    增强SAP预留的屏幕结构【CI_EKPODB
    在这里插入图片描述

    二、创建函数组

    1、函数【ZFM_EKPO_POP】

    FUNCTION zfm_ekpo_pop.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  EXPORTING
    *"     REFERENCE(EX_DYNP_DATA) TYPE  CI_EKPODB
    *"----------------------------------------------------------------------
    
    * get dynpro data
    
      ex_dynp_data = ci_ekpodb.
    
    ENDFUNCTION.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2、函数【ZFM_EKPO_PUSH】

    FUNCTION ZFM_EKPO_PUSH.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     REFERENCE(IM_DYNP_DATA) TYPE  CI_EKPODB
    *"----------------------------------------------------------------------
    
    * set dynpro data
    
      ci_ekpodb = im_dynp_data.
    
    ENDFUNCTION.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、创建屏幕

    在这里插入图片描述

    4、TOP定义

    在函数公共定义里加入如下代码

    FUNCTION-POOL zfg_poitem_enh.               "MESSAGE-ID ..
    
    * INCLUDE LZFG_POITEM_ENHD...                " Local class definition
    
    * dynpro output structure
      TABLES: ci_ekpodb.
    
    * definitions required for dynpro/framework integration
    DATA: ok-code TYPE sy-ucomm.
    INCLUDE lmeviewsf01.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5、PBO、PAI

    PROCESS BEFORE OUTPUT.
      MODULE event_pbo.
    
    PROCESS AFTER INPUT.
      MODULE event_pai.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、实施BADI----ME_GUI_PO_CUST

    1、属性定义

    在这里插入图片描述

    2、SUBSCRIBE

      METHOD if_ex_me_gui_po_cust~subscribe.
    
        DATA: lw_subscribes LIKE LINE OF re_subscribers.
    
        CHECK im_application = 'PO'.
        CHECK im_element = 'ITEM'.
    
        CLEAR re_subscribers[].
        lw_subscribes-name = subscreen1.
        lw_subscribes-dynpro = '1000'.
        lw_subscribes-program = 'SAPLZFG_POITEM_ENH'.
        lw_subscribes-struct_name = 'CI_EKPODB'.
        lw_subscribes-label = '测试增强页签'.
        lw_subscribes-position = '30'.  "页签的位置,尽量大一点,确保在最后一个页签
        lw_subscribes-height = '7'.
        INSERT lw_subscribes INTO TABLE re_subscribers.
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3、MAP_DYNPRO_FIELDS

    这里的mmmfd_cust字段SAP只给预留了10个,貌似只能增强十个字段。

      METHOD if_ex_me_gui_po_cust~map_dynpro_fields.
    
        FIELD-SYMBOLS: <mapping> LIKE LINE OF ch_mapping.
    
        LOOP AT ch_mapping ASSIGNING <mapping>.
          CASE <mapping>-fieldname.
            WHEN 'TEST_FIELD1'. <mapping>-metafield  = mmmfd_cust_01.
            WHEN 'TEST_FIELD2'. <mapping>-metafield  = mmmfd_cust_02.
            WHEN 'TEST_FIELD3'. <mapping>-metafield  = mmmfd_cust_03.
          ENDCASE.
        ENDLOOP.
    
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、TRANSPORT_FROM_MODEL

      METHOD if_ex_me_gui_po_cust~transport_from_model.
    
        DATA: l_item      TYPE REF TO if_purchase_order_item_mm,
              ls_mepoitem TYPE mepoitem,
              ls_customer TYPE ci_ekpodb.
    
    
        IF im_name = subscreen1.
          mmpur_dynamic_cast l_item im_model.
          CHECK NOT l_item IS INITIAL.
    * transport standard fields
          ls_mepoitem = l_item->get_data( ).
    
          "增强字段
          ls_customer-test_field1 = ls_mepoitem-test_field1.
          ls_customer-test_field2 = ls_mepoitem-test_field2.
          ls_customer-test_field3 = ls_mepoitem-test_field3.
    
    * store info for later use
          MOVE-CORRESPONDING ls_customer TO dynp_data_pbo.
    
        ENDIF.
    
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5、TRANSPORT_TO_DYNP

      METHOD if_ex_me_gui_po_cust~transport_to_dynp.
    
        IF im_name = subscreen1.
          CALL FUNCTION 'ZFM_EKPO_PUSH'
            EXPORTING
              im_dynp_data = dynp_data_pbo.
        ENDIF.
    
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6、TRANSPORT_FROM_DYNP

      METHOD if_ex_me_gui_po_cust~transport_from_dynp.
    
        IF im_name = subscreen1.
          CALL FUNCTION 'ZFM_EKPO_POP'
            IMPORTING
              ex_dynp_data = dynp_data_pai.
        ENDIF.
    
        IF dynp_data_pai <> dynp_data_pbo.
    * something has changed therefor we have to notify the framework
    * to transport data to the model
          re_changed = mmpur_yes.
        ENDIF.
    
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7、TRANSPORT_TO_MODEL

      METHOD if_ex_me_gui_po_cust~transport_to_model.
    
        DATA: l_item      TYPE REF TO if_purchase_order_item_mm,
              ls_mepoitem TYPE mepoitem.
    *--------------------------------------------------------------------*
    * data have to be transported to business logic
    *--------------------------------------------------------------------*
        IF im_name = subscreen1.
    
    * is it an item? im_model can be header or item.
          mmpur_dynamic_cast l_item im_model.
          CHECK NOT l_item IS INITIAL.
          ls_mepoitem = l_item->get_data( ).
    * standard fields changed?
          IF dynp_data_pbo <> dynp_data_pai.
    ** update standard fields
    
            "把增强更新赋给mepoitem字段
            ls_mepoitem-test_field1 = dynp_data_pai-test_field1.
            ls_mepoitem-test_field2 = dynp_data_pai-test_field2.
            ls_mepoitem-test_field3 = dynp_data_pai-test_field3.
            CALL METHOD l_item->set_data( ls_mepoitem ).
    
          ENDIF.
        ENDIF.
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    四、实施BADI----ME_PROCESS_PO_CUST

    实现了前几步以后,我们就可以看到【ME23N】里边已经增强好屏幕了,但是在【ME21N/ME22N】里面还是没有增强的屏幕,就需要继续实施BADI才可以。

    1、FIELDSELECTION_ITEM

    如果是抬头就是【FIELDSELECTION_HEADER】

    前面BADI第二个方法增强了三个字段这里调整为显示
    '-'代表hidden、 '+‘或’.‘表示editable,、’*'代表display

      METHOD if_ex_me_process_po_cust~fieldselection_item.
    
        DATA: l_persistent TYPE mmpur_bool.
    
        FIELD-SYMBOLS: <fs> LIKE LINE OF ch_fieldselection.
    
          DEFINE set_input.
        read table ch_fieldselection assigning <fs> with table key metafield = &1.
        if sy-subrc = 0.
          if im_header->is_changeable( ) = mmpur_yes.
            <fs>-fieldstatus = '+'.  "'-'代表hidden, '+''.'表示editable, '*'代表display
          else.
            <fs>-fieldstatus = '*'.
          endif.
        endif.
      END-OF-DEFINITION.
    
    * if the item is already on the database, we disallow to change field badi_bsgru
    
      l_persistent = im_header->is_persistent( ).
    
    "前面BADI第二个方法增强了三个字段这里调整为显示
      set_input mmmfd_cust_01.
      set_input mmmfd_cust_02.
      set_input mmmfd_cust_03.
    
    * ENDIF.
      ENDMETHOD.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    五、效果展示

    在这里插入图片描述
    作者:小飞猪猪猪猪猪猪猪–CSDN

  • 相关阅读:
    不能乱动的依赖包glibc,openssl,libcom_err
    mysql oracle统计报表每天每月每年SQL
    报错:“ModuleNotFoundError: No module named ‘flask._compat‘”的解决
    js数据结构(队列Queue)
    生命 周期
    c++ decltype()的两个特殊情况
    nRF5340(入门篇)之1.0 window下开发环境搭建
    IDEA工具之debug第三方jar包源码顺序错乱
    大型语言模型与知识图谱融合方法概述
    Hutool的简单使用
  • 原文地址:https://blog.csdn.net/JYH1999/article/details/126145044