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.

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.

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.

5、PBO、PAI

PROCESS BEFORE OUTPUT.
  MODULE event_pbo.

PROCESS AFTER INPUT.
  MODULE event_pai.

三、实施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.

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.

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.

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.

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.

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.

四、实施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.

五、效果展示

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

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值