根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签。效果如下:
因为是在抬头上边添加,所以增强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中,激活后就成功了。
定期更文,欢迎关注