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】
二、創(chuàng)建函數組
1、函數【ZFM_EKPO_POP】
FUNCTION zfm_ekpo_pop. *"---------------------------------------------------------------------- *"*"本地接口: *" EXPORTING *" REFERENCE(EX_DYNP_DATA) TYPE CI_EKPODB *"----------------------------------------------------------------------* get dynpro dataex_dynp_data = ci_ekpodb.ENDFUNCTION.2、函數【ZFM_EKPO_PUSH】
FUNCTION ZFM_EKPO_PUSH. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(IM_DYNP_DATA) TYPE CI_EKPODB *"----------------------------------------------------------------------* set dynpro dataci_ekpodb = im_dynp_data.ENDFUNCTION.3、創(chuàng)建屏幕
4、TOP定義
在函數公共定義里加入如下代碼
FUNCTION-POOL zfg_poitem_enh. "MESSAGE-ID ..* INCLUDE LZFG_POITEM_ENHD... " Local class definition* dynpro output structureTABLES: 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 fieldsls_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 useMOVE-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'EXPORTINGim_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'IMPORTINGex_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 modelre_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】里面還是沒有增強的屏幕,就需要繼續(xù)實施BADI才可以。
1、FIELDSELECTION_ITEM
如果是抬頭就是【FIELDSELECTION_HEADER】
前面BADI第二個方法增強了三個字段這里調整為顯示
'-'代表hidden、 '+‘或’.‘表示editable,、’*'代表display
五、效果展示
作者:小飛豬豬豬豬豬豬豬–CSDN
總結
以上是生活随笔為你收集整理的SAP 采购订单行项目屏幕增强(BADI)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8的cmd运行命令大全
- 下一篇: 内网漫游之SOCKS代理大结局