ME21N 采购订单新增页签增强

发布时间 2023-08-23 17:14:12作者: 斌将军

1、实现效果

根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签。效果如下:

2、增强实现

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中,激活后就成功了。