根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签。效果如下:
## 2.1、增强结构
因为是在抬头上边添加,所以增强CI_EKKODB结构
## 2.2、函数组
仿照Function Group MEPOBADIEX建一个Function Group
函数组:
## 2.3、增强实施
### 2.3.1、BADI:ME_GUI_PO_CUST
**方法:SUBSCRIBE**
"--------------------@斌将军--------------------method IF_EX_ME_GUI_PO_CUST~SUBSCRIBE. DATA: LS_SUBSCRIBERS TYPE MEPO_SUBSCRIBERS.*1 抬头 IF IM_APPLICATION = 'PO' AND IM_ELEMENT = 'HEADER'. CLEAR RE_SUBSCRIBERS[] . CLEAR LS_SUBSCRIBERS. LS_SUBSCRIBERS-NAME = SUBSCREEN_H."屏幕名称 LS_SUBSCRIBERS-DYNPRO = '9001'."函数组的屏幕编号 LS_SUBSCRIBERS-PROGRAM = 'SAPLZMMPO001'."调用的函数组 LS_SUBSCRIBERS-STRUCT_NAME = 'CI_EKKODB'."增强的结构 LS_SUBSCRIBERS-LABEL = '其他数据'."页签名称 LS_SUBSCRIBERS-POSITION = 30."页签处于的位置 LS_SUBSCRIBERS-HEIGHT = 7."页签高度 APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS. ENDIF.*2 * IF IM_APPLICATION = 'PO' AND IM_ELEMENT = 'ITEM'.* CLEAR RE_SUBSCRIBERS[] .* CLEAR LS_SUBSCRIBERS.* LS_SUBSCRIBERS-NAME = SUBSCREEN_I.* LS_SUBSCRIBERS-DYNPRO = '9100'.* LS_SUBSCRIBERS-PROGRAM = 'SAPLZMM003'.* LS_SUBSCRIBERS-STRUCT_NAME = 'CI_EKPODB'.* LS_SUBSCRIBERS-LABEL = 'Badi增强行项目屏幕'.* LS_SUBSCRIBERS-POSITION = 24. "页签处于的位置* LS_SUBSCRIBERS-HEIGHT = 4.* APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS.* ENDIF. endmethod."--------------------@斌将军--------------------
定义相关属性
**方法:MAP_DYNPRO_FIELDS**
"--------------------@斌将军--------------------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 'ZEJFL'. <mapping>-metafield = mmmfd_cust_01. "抬头* WHEN 'ZHEAD02'. <mapping>-metafield = mmmfd_cust_02.* WHEN 'ZZ001'. <mapping>-metafield = mmmfd_cust_03. "明细* WHEN 'ZZ005'. <mapping>-metafield = mmmfd_cust_04.* "自定义字段* WHEN 'ZFIELD3'.<mapping>-metafield = mmmfd_cust_05. ENDCASE. ENDLOOP. endmethod."--------------------@斌将军--------------------**方法:TRANSPORT_FROM_MODEL**
"--------------------@斌将军--------------------method IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_MODEL. DATA: ls_header TYPE REF TO if_purchase_order_mm, ls_mepoheader TYPE mepoheader, ls_item TYPE REF TO if_purchase_order_item_mm, ls_mepoitem TYPE mepoitem.*1 抬头 IF im_name = subscreen_h. mmpur_dynamic_cast ls_header im_model. IF ls_header IS NOT INITIAL. ls_mepoheader = ls_header->get_data( ). MOVE-CORRESPONDING ls_mepoheader TO dynp_data_pbo_h. ENDIF. ENDIF.*2 明细* IF im_name = subscreen_i.* mmpur_dynamic_cast ls_item im_model.* IF ls_item IS NOT INITIAL.* ls_mepoitem = ls_item->get_data( ).* MOVE-CORRESPONDING ls_mepoitem TO dynp_data_pbo_i.* ENDIF.* ENDIF. endmethod."--------------------@斌将军--------------------**方法:TRANSPORT_TO_DYNP**
"--------------------@斌将军--------------------METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_DYNP. CASE IM_NAME.*1 抬头 WHEN SUBSCREEN_H. call function 'ZMMPO001_PUSH' EXPORTING IM_DYNP_DATA = DYNP_DATA_PBO_H.*2 明细* WHEN subscreen_i.* CALL FUNCTION 'ZMMPO002_PUSH'* EXPORTING* im_dynp_data = dynp_data_pbo_i. WHEN OTHERS. ENDCASE. ENDMETHOD."--------------------@斌将军--------------------
**方法:TRANSPORT_FROM_DYNP**
"--------------------@斌将军--------------------METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP. CASE IM_NAME.*1 抬头 WHEN SUBSCREEN_H. call function 'ZMMPO001_POP' IMPORTING EX_DYNP_DATA = DYNP_DATA_PAI_H. IF DYNP_DATA_PAI_H <> DYNP_DATA_PBO_H. RE_CHANGED = MMPUR_YES. ENDIF.*2 明细* WHEN subscreen_i.* CALL FUNCTION 'ZMMPO002_POP'* IMPORTING* ex_dynp_data = dynp_data_pai_i.* IF dynp_data_pai_i <> dynp_data_pbo_i.* re_changed = mmpur_yes.* ENDIF. WHEN OTHERS. ENDCASE. ENDMETHOD."--------------------@斌将军--------------------
**方法:TRANSPORT_TO_MODEL**
"--------------------@斌将军--------------------method IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL. DATA: ls_header TYPE REF TO if_purchase_order_mm, ls_mepoheader TYPE mepoheader, ls_po_head_customer TYPE ci_ekkodb, ls_po_header_handle TYPE REF TO cl_po_header_handle_mm, ls_item TYPE REF TO if_purchase_order_item_mm, ls_mepoitem TYPE mepoitem, ls_po_item_customer TYPE ci_ekpodb, ls_po_item_handle TYPE REF TO cl_po_item_handle_mm.
CASE im_name.*1 抬头 WHEN subscreen_h. mmpur_dynamic_cast ls_header im_model. IF ls_header IS NOT INITIAL. ls_mepoheader = ls_header->get_data( ). IF dynp_data_pbo_h-ZEJFL <> dynp_data_pai_h-ZEJFL.* OR dynp_data_pbo_h-zhead02 <> dynp_data_pai_h-zhead02. ls_mepoheader-ZEJFL = dynp_data_pai_h-ZEJFL.* ls_mepoheader-zhead02 = dynp_data_pai_h-zhead02. CALL METHOD ls_header->set_data EXPORTING im_data = ls_mepoheader. ENDIF. ENDIF.*2 明细* WHEN subscreen_i.* mmpur_dynamic_cast ls_item im_model.* IF ls_item IS NOT INITIAL.* ls_mepoitem = ls_item->get_data( ).* IF dynp_data_pbo_i-zz001 <> dynp_data_pai_i-zz001* OR dynp_data_pbo_i-zz005 <> dynp_data_pai_i-zz005.** ls_mepoitem-zz001 = dynp_data_pai_i-zz001.* ls_mepoitem-zz005 = dynp_data_pai_i-zz005.** CALL METHOD ls_item->set_data* EXPORTING* im_data = ls_mepoitem.* ENDIF.* ENDIF. WHEN OTHERS. ENDCASE. endmethod."--------------------@斌将军--------------------### 2.3.2、BADI:ME_PROCESS_PO_CUST
到此处,ME23N就可以看到新增的页签,但是ME21N和ME22N看不到,还需要实现一个BADI:ME_PROCESS_PO_CUST的FIELDSELECTION_HEADER方法。
**该BADI只能创建一个实施,如果已经有多个实施,将达不到效果。**
"--------------------@斌将军--------------------method IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER.DATA:ex_data TYPE mepoheader. DATA: LV_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.LV_PERSISTENT = IM_HEADER->IS_PERSISTENT( ).
SET_INPUT MMMFD_CUST_01. "获取订单数据 CLEAR:ex_data.* ex_data = im_header->get_data( ).* SET_INPUT MMMFD_CUST_02.endmethod."--------------------@斌将军--------------------
对抬头和行项目输入数据的检查可放在方法:PROCESS_HEADER和PROCESS_ITEM中,激活即可。