根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签。效果如下:
因为是在抬头上边添加,所以增强CI_EKKODB结构
仿照Function Group MEPOBADIEX建一个Function Group
函数组:
方法: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: LIKE LINE OF ch_mapping.
LOOP AT ch_mapping ASSIGNING .
CASE -fieldname.
WHEN 'ZEJFL'. -metafield = mmmfd_cust_01. "抬头
* WHEN 'ZHEAD02'. -metafield = mmmfd_cust_02.
* WHEN 'ZZ001'. -metafield = mmmfd_cust_03. "明细
* WHEN 'ZZ005'. -metafield = mmmfd_cust_04.
* "自定义字段
* WHEN 'ZFIELD3'.-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.
"--------------------@斌将军--------------------
到此处,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: LIKE LINE OF CH_FIELDSELECTION.
DEFINE SET_INPUT.
READ TABLE ch_fieldselection ASSIGNING WITH TABLE KEY metafield = &1.
IF sy-subrc = 0.
IF im_header->is_changeable( ) = mmpur_yes.
-fieldstatus = '+'."'-'代表hidden, '+'或'.'表示editable, '*'代表display
ELSE.
-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中,激活后就成功了。
定期更文,欢迎关注