导语:前面写了一个采购订单抬头增强,用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