SAP MIGO 屏幕增强总结

最近接到MIGO屏幕增强的需求,与其他屏幕增强稍有区别,在此做下总结备忘。

将增强字段放在自定义表中,避免直接更新标准MKPF/MSEG表结构。

(部分自定义检查逻辑取数可参考,其他自行忽略)

总体实现方式:

1、创建自定义表(增强字段就在这里)。

2、实现BADI: MB_MIGO_BADI

3、创建函数组、相关数据交互函数、屏幕

实现细节:

1、创建自定义表

Head Table:

 Item Table:

Item table的表类型:(函数使用)

 

2、实现BADI: MB_MIGO_BADI

实施类属性参数:

 实施类方法清单:

IF_EX_MB_MIGO_BADI~INIT
  METHOD if_ex_mb_migo_badi~init.
    CALL FUNCTION 'ZZMM_MIGO_INIT'
      CHANGING
        ct_init = ct_init.
   APPEND gf_class_id TO ct_init.
 ENDMETHOD.

IF_EX_MB_MIGO_BADI~PBO_DETAIL
  METHOD if_ex_mb_migo_badi~pbo_detail.

  CHECK gf_class_id = i_class_id.
  CHECK i_line_id IS NOT INITIAL.

  DATA: lwa_mseg_badi TYPE zsmm017i_badi.
  READ TABLE it_mseg_badi WITH KEY global_cnt = i_line_id
                          INTO lwa_mseg_badi.
*  IF sy-subrc = 0.
    CALL FUNCTION 'ZMM_MIGO_ITEM_SETDATA'
      EXPORTING
        i_input = lwa_mseg_badi.

    e_cprog = 'SAPLZMM011'.
    e_dynnr = '9001'.
    e_heading = '客制化字段'.
*  ENDIF.
  ENDMETHOD.

IF_EX_MB_MIGO_BADI~PAI_DETAIL
  METHOD if_ex_mb_migo_badi~pai_detail.

  DATA: lwa_mseg_badi TYPE zsmm017i_badi.
  DATA: lwa_mseg_badi_screen TYPE zsmm017i_badi.
  READ TABLE it_mseg_badi WITH KEY global_cnt = i_line_id
                          INTO lwa_mseg_badi.
  IF sy-subrc = 0.
    CALL FUNCTION 'ZMM_MIGO_ITEM_GETDATA'
      IMPORTING
        e_output = lwa_mseg_badi_screen.
    IF lwa_mseg_badi_screen-global_cnt = i_line_id.
      IF lwa_mseg_badi <> lwa_mseg_badi_screen.
        e_force_change = 'X'.
      ENDIF.
    ENDIF.
  ELSE.

  ENDIF.
  ENDMETHOD.

IF_EX_MB_MIGO_BADI~LINE_MODIFY
  METHOD if_ex_mb_migo_badi~line_modify.

    "保存时走这段逻辑
*    IF SY-UCOMM = 'OK_POST' OR SY-UCOMM = 'OK_POST1' .
    "如果行项目成本中心为空则不需要替代
    IF cs_goitem-kostl IS NOT INITIAL .

      SELECT SINGLE
        bwart
       INTO @DATA(lv_bwart)
       FROM ztco003
       WHERE bwart = @cs_goitem-bwart.

      IF sy-subrc = 0 .

        "先判断移动类型是否在自建表2中有维护,有则继续,无则退出。
        SELECT SINGLE
         bukrs
        INTO @DATA(lv_bukrs)
        FROM t001w JOIN t001k ON t001w~bwkey = t001k~bwkey
        WHERE werks = @cs_goitem-werks.

        "根据行项目的公司代码BUKRS获取TKA02-KOKRS,控制范围
        SELECT SINGLE
          kokrs
         INTO @DATA(lv_kokrs)
         FROM tka02
         WHERE bukrs = @lv_bukrs.

        IF lv_kokrs IS NOT INITIAL.
          "根据KOKRS+行项目成本中心KOSTL找CSKS-DATBI最大值的行
          SELECT
            kostl,
            datbi,
            kosar
          INTO TABLE @DATA(lt_csks)
          FROM csks
          WHERE kokrs = @lv_kokrs AND kostl = @cs_goitem-kostl.
          SORT lt_csks BY datbi DESCENDING .

          READ TABLE lt_csks INTO DATA(ls_csks) INDEX 1.
          IF sy-subrc = 0.

            SELECT SINGLE
              bklas
            INTO @DATA(lv_bklas)
            FROM mbew
            WHERE bwkey = @cs_goitem-werks AND matnr = @cs_goitem-matnr.

            " 根据公司代码BUKRS+科目HKONT+成本中心类型KOSAR获取自建表1中的目标科目HKONT1
            SELECT SINGLE
              hkont1
            INTO @DATA(lv_hkont1)
            FROM ztco003
            WHERE bukrs = @lv_bukrs AND bwart = @cs_goitem-bwart
              AND kosar = @ls_csks-kosar AND bklas = @lv_bklas.

            IF lv_hkont1 IS NOT INITIAL.
              cs_goitem-konto = lv_hkont1.
            ELSE.
              " 根据公司代码BUKRS+评估类为空+移动类型+成本中心类型KOSAR获取自建表1中的目标科目HKONT1
              SELECT SINGLE
                hkont1
              INTO lv_hkont1
              FROM ztco003
              WHERE bukrs = lv_bukrs AND bwart = cs_goitem-bwart
                AND kosar = ls_csks-kosar AND bklas = ''.
              IF lv_hkont1 IS NOT INITIAL..
                cs_goitem-konto = lv_hkont1.
              ENDIF.

            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
*    ENDIF.

  IF  gt_goitem[] IS NOT INITIAL.
    READ TABLE gt_goitem INTO gs_goitem WITH KEY zeile =  cs_goitem-zeile.
    IF sy-subrc NE 0.
      APPEND  cs_goitem TO gt_goitem.
    ELSE.
      MODIFY gt_goitem FROM cs_goitem INDEX sy-tabix.
    ENDIF.
  ELSE.
    APPEND cs_goitem TO gt_goitem.
  ENDIF.

""migo 行项目字段增强
  DATA: lwa_zmseg TYPE ztmm017i.
  DATA: lwa_mseg_badi TYPE zsmm017i_badi.
  DATA: lwa_mseg_badi_screen TYPE zsmm017i_badi.
  FIELD-SYMBOLS: <fs_mseg_badi> LIKE lwa_mseg_badi.
  DATA: l_del TYPE sy-tabix.

  CHECK i_line_id <> 0.
  READ TABLE it_mseg_badi WITH KEY global_cnt = i_line_id
                          TRANSPORTING NO FIELDS.
  IF sy-subrc = 0.
**************取屏幕中现有数据
    CLEAR: lwa_mseg_badi_screen.
    CALL FUNCTION 'ZMM_MIGO_ITEM_GETDATA'
      IMPORTING
        e_output = lwa_mseg_badi_screen.

    IF lwa_mseg_badi_screen-global_cnt = i_line_id.
**************BADI全局变量中已存在
      DELETE it_mseg_badi WHERE global_cnt = i_line_id.
      MOVE-CORRESPONDING lwa_mseg_badi_screen TO lwa_mseg_badi.
*      lwa_mseg_badi-zfield = lwa_mseg_badi_screen-zfield.
      APPEND lwa_mseg_badi TO it_mseg_badi.
    ENDIF.
  ELSE.
**************BADI全局变量中不存在
    IF NOT cs_goitem-mblnr IS INITIAL
      AND NOT cs_goitem-mjahr IS INITIAL
       AND NOT cs_goitem-zeile IS INITIAL.
**************从自定义表中取数
      CLEAR: lwa_zmseg.
      SELECT SINGLE *
        FROM ztmm017i
        INTO CORRESPONDING FIELDS OF lwa_zmseg
       WHERE mblnr EQ cs_goitem-mblnr
         AND mjahr EQ cs_goitem-mjahr
         AND zeile EQ cs_goitem-zeile.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING lwa_zmseg TO lwa_mseg_badi.
      ELSE.
        MOVE-CORRESPONDING cs_goitem TO lwa_mseg_badi.
      ENDIF.
    ELSE.
      MOVE-CORRESPONDING cs_goitem TO lwa_mseg_badi.
    ENDIF.
    lwa_mseg_badi-global_cnt = i_line_id.
    APPEND lwa_mseg_badi TO it_mseg_badi.
  ENDIF.
""migo 行项目字段增强


ENDMETHOD.

IF_EX_MB_MIGO_BADI~LINE_DELETE
  METHOD if_ex_mb_migo_badi~line_delete.
    DELETE it_mseg_badi  WHERE glObal_cnt = i_line_id.
  ENDMETHOD.


IF_EX_MB_MIGO_BADI~RESET

  METHOD if_ex_mb_migo_badi~reset.
    CALL FUNCTION 'ZZMM_MIGO_RESET'.
  ENDMETHOD.

IF_EX_MB_MIGO_BADI~POST_DOCUMENT
  METHOD if_ex_mb_migo_badi~post_document.

  LOOP AT it_mseg_badi INTO  DATA(lwa_mseg_badi).
    lwa_mseg_badi-mandt = sy-mandt.
    lwa_mseg_badi-mblnr = is_mkpf-mblnr.
    lwa_mseg_badi-mjahr = is_mkpf-mjahr.
    MODIFY it_mseg_badi FROM lwa_mseg_badi TRANSPORTING mandt mblnr mjahr.
  ENDLOOP.

    CALL FUNCTION 'ZZMM_MIGO_POST_DOCUMENT'
      EXPORTING
        is_mkpf = is_mkpf
     TABLES
        it_mseg = it_mseg_badi.

    CLEAR   gt_goitem[].

  ENDMETHOD.

IF_EX_MB_MIGO_BADI~CHECK_ITEM
  METHOD if_ex_mb_migo_badi~check_item.

    CONSTANTS:c_aufnr(50) VALUE '(SAPLMIGO)GOITEM-PPS_AUFNR'.
    CONSTANTS:c_posnr(50) VALUE '(SAPLMIGO)GOITEM-PPS_POSNR'.
    CONSTANTS:c_bwart(50) VALUE '(SAPLMIGO)GOITEM-BWART'.
    CONSTANTS:c_werks(50) VALUE '(SAPLMIGO)GOITEM-WERKS'.
    CONSTANTS:c_erfmg(50) VALUE '(SAPLMIGO)GOITEM-ERFMG'.
    CONSTANTS:c_menge(50) VALUE '(SAPLMIGO)GOITEM-MENGE'.
    CONSTANTS:c_wemng(50) VALUE '(SAPLMIGO)GOITEM-WEMNG'.
    CONSTANTS:c_budat(50) VALUE '(SAPLMIGO)GOHEAD-BUDAT'.
    FIELD-SYMBOLS:<fs_aufnr> TYPE any.
    FIELD-SYMBOLS:<fs_posnr> TYPE any.
    FIELD-SYMBOLS:<fs_bwart> TYPE any.
    FIELD-SYMBOLS:<fs_werks> TYPE any.
    FIELD-SYMBOLS:<fs_erfmg> TYPE any.
    FIELD-SYMBOLS:<fs_menge> TYPE any.
    FIELD-SYMBOLS:<fs_wemng> TYPE any.
    FIELD-SYMBOLS:<fs_budat> TYPE any.
    ASSIGN (c_aufnr) TO <fs_aufnr>.
    ASSIGN (c_posnr) TO <fs_posnr>.
    ASSIGN (c_bwart) TO <fs_bwart>.
    ASSIGN (c_werks) TO <fs_werks>.
    ASSIGN (c_erfmg) TO <fs_erfmg>.
    ASSIGN (c_menge) TO <fs_menge>.
    ASSIGN (c_wemng) TO <fs_wemng>.
    ASSIGN (c_budat) TO <fs_budat>.
    DATA:ls_return TYPE bapiret2,
         lv_cancel TYPE c.

   LOOP AT  gt_goitem INTO gs_goitem  WHERE  take_it IS NOT INITIAL AND zeile = i_line_id .
     UNASSIGN:<fs_posnr>,<fs_bwart>,<fs_werks>,<fs_erfmg>,<fs_erfmg>,<fs_wemng>.
     ASSIGN gs_goitem-posnr TO  <fs_posnr>.
     ASSIGN gs_goitem-bwart TO  <fs_bwart>.
     ASSIGN gs_goitem-werks TO  <fs_werks>.
     ASSIGN gs_goitem-erfmg TO  <fs_erfmg>.
     ASSIGN gs_goitem-menge TO  <fs_menge>.
     ASSIGN gs_goitem-wemng TO  <fs_wemng>.

    CLEAR lv_cancel.
    IF  <fs_budat>(6) NE sy-datum(6).
      SELECT SINGLE  cancel INTO lv_cancel FROM ztfi075 WHERE werks = <fs_werks>.
      IF  lv_cancel IS INITIAL.
        ls_return-type = 'E'.
        ls_return-id   = 'ZMSG'.
        ls_return-number = '066'.
        APPEND ls_return TO et_bapiret2.
        RETURN.
      ENDIF.
    ENDIF.

 ENDLOOP.

  ENDMETHOD.

IF_EX_MB_MIGO_BADI~MODE_SET
  METHOD if_ex_mb_migo_badi~mode_set.
    mv_action = i_action.
    mv_refdoc = i_refdoc.
  ENDMETHOD.

IF_EX_MB_MIGO_BADI~STATUS_AND_HEADER
  METHOD if_ex_mb_migo_badi~status_and_header.
    CALL FUNCTION 'ZZMM_MIGO_READ_DATA'
      EXPORTING
        i_lines_in_model    = i_lines_in_model
        is_gohead           = is_gohead
      CHANGING
        e_hold_data_disable = e_hold_data_disable.

  ENDMETHOD.

IF_EX_MB_MIGO_BADI~HOLD_DATA_SAVE
IF_EX_MB_MIGO_BADI~HOLD_DATA_LOAD
IF_EX_MB_MIGO_BADI~HOLD_DATA_DELETE

IF_EX_MB_MIGO_BADI~PBO_HEADER
  METHOD if_ex_mb_migo_badi~pbo_header.
    CALL FUNCTION 'ZZMM_MIGO_PBO_HEADER'
      EXPORTING
        i_class_id = i_class_id
      IMPORTING
        e_cprog    = e_cprog
        e_dynnr    = e_dynnr
        e_heading  = e_heading.

  ENDMETHOD.

IF_EX_MB_MIGO_BADI~PAI_HEADER
  METHOD if_ex_mb_migo_badi~pai_header.
    CALL FUNCTION 'ZZMM_MIGO_PAI_HEADER'
      EXPORTING
        i_okcode  = i_okcode
        is_gohead = is_gohead.

  ENDMETHOD.

IF_EX_MB_MIGO_BADI~CHECK_HEADER
  METHOD if_ex_mb_migo_badi~check_header.
    CONSTANTS:c_reason1(50) VALUE '(SAPLZMM011)ZTMM017-REASON1'.
    CONSTANTS:c_reason2(50) VALUE '(SAPLZMM011)ZTMM017-REASON2'.
    CONSTANTS:c_werks(50) VALUE '(SAPLMIGO)GOITEM-WERKS'.

    FIELD-SYMBOLS:<fs_reason1> TYPE any.
    FIELD-SYMBOLS:<fs_reason2> TYPE any.
    FIELD-SYMBOLS:<fs_werks> TYPE any.

    ASSIGN (c_reason1) TO <fs_reason1>.
    ASSIGN (c_reason2) TO <fs_reason2>.
    ASSIGN (c_werks) TO <fs_werks>.
    DATA:ls_return TYPE bapiret2,
         lv_check  TYPE c.
    IF <fs_reason1> IS ASSIGNED AND <fs_reason2> IS ASSIGNED.
      SELECT * INTO TABLE @DATA(lt_ztmm00) FROM ztmm00 WHERE zid = 'MM0005' AND zkey1 = 'WERKS'.
      IF sy-subrc = 0.
        LOOP AT lt_ztmm00 INTO DATA(ls_ztmm00).
          READ TABLE gt_goitem INTO gs_goitem WITH KEY bwkey = ls_ztmm00-zvalue1.
          IF sy-subrc = 0.
            lv_check = 'X'.
            EXIT.
          ENDIF.
        ENDLOOP.

        IF lv_check = 'X'.
          IF <fs_reason1> IS INITIAL .
            ls_return-type    = 'E'.
            ls_return-id      = 'ZMSG'.
            ls_return-number  = '080'.
            APPEND ls_return TO et_bapiret2.
          ELSEIF <fs_reason1> = '99'.
            IF <fs_reason2> IS ASSIGNED.
              IF <fs_reason2> IS INITIAL.
                ls_return-type    = 'E'.
                ls_return-id      = 'ZMSG'.
                ls_return-number  = '081'.
                APPEND ls_return TO et_bapiret2.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD.


IF_EX_MB_MIGO_BADI~PUBLISH_MATERIAL_ITEM
IF_EX_MB_MIGO_BADI~PROPOSE_SERIALNUMBERS
IF_EX_MB_MIGO_BADI~MAA_LINE_ID_ADJUST

3、创建函数组、相关数据交互函数、屏幕

函数组:ZMM011

LZMM011TOP
FUNCTION-POOL zmm011.                       "MESSAGE-ID ..

* INCLUDE LZMM011D...                        " Local class definition

TABLES: ztmm017,zsmm017i_badi.

TYPES: BEGIN OF ty_s_action,
         cancel     TYPE abap_bool,     "Cancel material document
         create     TYPE abap_bool,     "Create material document
         copy       TYPE abap_bool,     "Copy   material document  ERP 10
         display    TYPE abap_bool,     "Display material document
         change     TYPE abap_bool,     "Change material document   "1808576
         receipt    TYPE abap_bool,     "Normal goods receipt
         release    TYPE abap_bool,     "Release blocked stock
         return     TYPE abap_bool,     "Return to material document
         subsequent TYPE abap_bool,     "Subsequent delivery (WE**3)
         sc_comp    TYPE abap_bool,     "Outsourced Manufacturing EhP 4 /in-time consumption component
         place      TYPE abap_bool,     "Place in storage
         issue      TYPE abap_bool,
         migo_mode  TYPE char10,
         refdoctype TYPE char3,
       END OF ty_s_action.

FIELD-SYMBOLS: <fs_kernel_class> TYPE any.

DATA: gv_flag TYPE abap_bool,
      gs_ext_head TYPE ztmm017,
      gs_action  TYPE ty_s_action,
      ref_kernel TYPE REF TO object,
      BEGIN OF gs_group,
        g01 TYPE as4flag,
        g02 TYPE as4flag,
      END OF gs_group.
LZMM011O01
*----------------------------------------------------------------------*
***INCLUDE LZMM011O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module DISABLED_FIELDS OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE disabled_fields OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
  IF gs_group IS INITIAL.
    LOOP AT SCREEN.
      IF screen-group1 = 'G01' OR screen-group2 = 'G02'.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  GET_F4_DATA  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE get_f4_data INPUT.

  TYPES: BEGIN OF ty_tab,
      zpl TYPE ztmm043-zpl,
      zpl_name TYPE ztmm043-zpl_name,
    END OF ty_tab.
  DATA:lt_tab TYPE TABLE OF ty_tab.

  SELECT zpl zpl_name INTO CORRESPONDING FIELDS OF TABLE lt_tab FROM ztmm043.
  DELETE ADJACENT DUPLICATES FROM lt_tab COMPARING ALL FIELDS.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'ZPL'  "key值
      dynpprog         = sy-repid  "程序名,sy-repid表示本程序
      dynpnr           = sy-dynnr  "屏幕,y-dynnr表示当前屏幕
      dynprofield      = 'ZPL_NAME'  "需要在下拉框显示的字段
      value_org        = 'S'  "C表示cell,S表示structure
      callback_program = sy-repid"
    TABLES
      value_tab        = lt_tab "关联的内表
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.

  IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_DROPDOWN OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_dropdown OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
  DATA lt_vrm_value TYPE vrm_values.
  DATA ls_vrm_value TYPE LINE OF vrm_values.

  DATA ld_field TYPE vrm_id.

  CLEAR: lt_vrm_value.
  "查询数据
  SELECT * INTO TABLE @DATA(lt_ZTMM00)
    FROM ZTMM00
   WHERE ZID = 'MM0006'
     AND ZKEY1 = 'CODE'
     AND ZKEY2 = 'TEXT'.

  "数据放入下拉列表
  LOOP AT lt_ZTMM00 INTO DATA(lS_ZTMM00).
    ls_vrm_value-key = lS_ZTMM00-ZVALUE1.
    ls_vrm_value-text = lS_ZTMM00-ZVALUE2.

    APPEND ls_vrm_value TO lt_vrm_value.
    CLEAR ls_vrm_value.
  ENDLOOP.

  ld_field = 'ZTMM017-REASON1'.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = ld_field
      values = lt_vrm_value.

ENDMODULE.
LZMM011UXX
*****************************************************************
*   THIS FILE IS GENERATED BY THE FUNCTION LIBRARY.             *
*   NEVER CHANGE IT MANUALLY, PLEASE!                           *
*****************************************************************
INCLUDE LZMM011U01.
                    "ZZMM_MIGO_PBO_HEADER
INCLUDE LZMM011U02.
                    "ZZMM_MIGO_INIT
INCLUDE LZMM011U03.
                    "ZZMM_MIGO_POST_DOCUMENT
INCLUDE LZMM011U04.
                    "ZZMM_MIGO_PAI_HEADER
INCLUDE LZMM011U05.
                    "ZZMM_MIGO_RESET
INCLUDE LZMM011U06.
                    "ZZMM_MIGO_READ_DATA
INCLUDE LZMM011U07.
                    "ZZMM_MIGO_BAPI_CUST_FIELDS
INCLUDE LZMM011U08.
                    "ZZMM_MIGO_UPDATE_DATA
INCLUDE LZMM011U09.
                    "ZZMM_MIGO_BAPI_SAVE_FIELDS
INCLUDE LZMM011U10.
                    "ZMM_MIGO_ITEM_GETDATA
INCLUDE LZMM011U11.
                    "ZMM_MIGO_ITEM_SETDATA
INCLUDE LZMM011U12.
                    "ZZCONVERT_DATE_FORMAT
函数清单:
ZMM_MIGO_ITEM_GETDATA migo行项目数据从 SCREEN -> BADI 
FUNCTION zmm_migo_item_getdata.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     VALUE(E_OUTPUT) TYPE  ZSMM017I_BADI
*"----------------------------------------------------------------------

  ref_kernel ?= <fs_kernel_class>.

MOVE-CORRESPONDING zsmm017i_badi TO e_output.

ENDFUNCTION.
ZMM_MIGO_ITEM_SETDATA migo行项目数据从 BADI -> SCREEN
FUNCTION zmm_migo_item_setdata.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_INPUT) DEFAULT ZSMM017I_BADI
*"----------------------------------------------------------------------


  ref_kernel ?= <fs_kernel_class>.

  "获取MIGO的事务类型,如果为只读或取消,则所有增强字段只能显示
  ASSIGN ref_kernel->('S_ACTION') TO FIELD-SYMBOL(<fs_action>).
  IF sy-subrc EQ 0.
    MOVE-CORRESPONDING <fs_action> TO gs_action.
  ENDIF.
  IF gs_action-display EQ abap_true OR
     gs_action-cancel EQ abap_true.
    CLEAR: gs_group.
  ELSE.
    gs_group-g01 = abap_true.
    gs_group-g02 = abap_true.
  ENDIF.

MOVE-CORRESPONDING i_input TO zsmm017i_badi.


ENDFUNCTION.
ZZCONVERT_DATE_FORMAT 
FUNCTION ZZCONVERT_DATE_FORMAT.
*"--------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(I_DATE) TYPE  STRING
*"  EXPORTING
*"     VALUE(O_DATE) TYPE  DATUM
*"--------------------------------------------------------------------

DATA: lv_datfm LIKE usr01-datfm,
        lv_year(4) TYPE n,
        lv_month(2) TYPE n,
        lv_day(2) TYPE n.
DATA:lv_str TYPE c.

SEARCH i_date FOR '/'.
  IF sy-subrc = 0.
    lv_str = '/'.
  ELSE.
    SEARCH i_date FOR '.'.
    IF sy-subrc = 0.
      lv_str = '.'.
    ELSE.
      SEARCH i_date FOR '-'.
      IF sy-subrc = 0.
        lv_str = '-'.
      ENDIF.
    ENDIF.
  ENDIF.

  IF lv_str IS INITIAL .
   o_date = i_date.
   RETURN.
  ENDIF.

 SPLIT i_date AT lv_str INTO lv_year lv_month lv_day.

 IF lv_month < '10'.
   lv_month = |0{ lv_month }|.
 ENDIF.

 IF lv_day < '10'.
   lv_day = |0{ lv_day }|.
 ENDIF.

o_date = |{ lv_year }{ lv_month }{ lv_day }|.
ENDFUNCTION.
ZZMM_MIGO_BAPI_CUST_FIELDS MIGO增强BAPI客户化字段更新 
FUNCTION zzmm_migo_bapi_cust_fields.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(EXTENSION_IN) TYPE  BAPIPAREX_T
*"  CHANGING
*"     REFERENCE(CS_IMKPF) TYPE  IMKPF
*"     REFERENCE(CT_IMSEG) TYPE  TY_T_IMSEG
*"     REFERENCE(CT_RETURN) TYPE  BAPIRET2
*"----------------------------------------------------------------------

  DATA: ref_data TYPE REF TO data,

        ls_mkpf  TYPE mkpf,
        ls_cobl  TYPE bapicobl_ci.

  CLEAR: ztmm017.
  LOOP AT extension_in INTO DATA(ls_extension).
    TRY.
        CREATE DATA ref_data TYPE (ls_extension-structure).
      CATCH cx_root.
        CONTINUE.
    ENDTRY.
    ASSIGN ref_data->* TO FIELD-SYMBOL(<fs_data>).
    CONCATENATE ls_extension-valuepart1
                ls_extension-valuepart2
                ls_extension-valuepart3
                ls_extension-valuepart4
           INTO DATA(lv_value).
    BREAK handcxm.
    WRITE: lv_value TO <fs_data>.
    CASE ls_extension-structure.
      WHEN 'ZTMM017'.
        MOVE-CORRESPONDING <fs_data> TO ztmm017.
      WHEN 'BAPICOBL_CI'.
        MOVE-CORRESPONDING <fs_data> TO ls_cobl.
    ENDCASE.
  ENDLOOP.

  gv_flag = abap_true.
ENDFUNCTION.
ZZMM_MIGO_BAPI_SAVE_FIELDS MIGO增强BAPI客户化字段更新 
FUNCTION zzmm_migo_bapi_save_fields.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(XMKPF) TYPE  TY_T_MKPF
*"     REFERENCE(XMSEG) TYPE  TY_T_MSEG
*"     REFERENCE(XVM07M) TYPE  TY_T_VM07M
*"     REFERENCE(XDM07M) TYPE  TY_T_DM07M OPTIONAL
*"----------------------------------------------------------------------

  CHECK gv_flag EQ abap_true.
  "填充物料凭证号
  READ TABLE xmkpf INTO DATA(ls_mkpf) INDEX 1.
  ztmm017-mblnr = ls_mkpf-mblnr.
  ztmm017-mjahr = ls_mkpf-mjahr.

  "更新数据
  CALL FUNCTION 'ZZMM_MIGO_UPDATE_DATA' IN UPDATE TASK
    EXPORTING
      is_header = ztmm017.

ENDFUNCTION.
ZZMM_MIGO_INIT 初始化 
FUNCTION zzmm_migo_init.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  CHANGING
*"     REFERENCE(CT_INIT) TYPE  MIGO_BADI_REGISTRATION_TABLE
*"----------------------------------------------------------------------

  DATA: ls_init TYPE migo_badi_registration.

  ls_init-class_id = zcl_im_co_mb_migo_badi=>mc_class_name.
  APPEND ls_init TO ct_init.

  ASSIGN (zcl_im_co_mb_migo_badi=>mc_kernel_class) TO <fs_kernel_class>.

  CLEAR: gs_action,ztmm017.
ENDFUNCTION.
ZZMM_MIGO_PAI_HEADER 明细屏幕PAI 
FUNCTION zzmm_migo_pai_header.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_OKCODE) TYPE  SYUCOMM OPTIONAL
*"     REFERENCE(IS_GOHEAD) TYPE  GOHEAD OPTIONAL
*"----------------------------------------------------------------------

  ref_kernel ?= <fs_kernel_class>.

ENDFUNCTION.
ZZMM_MIGO_PBO_HEADER 明细屏幕的PBO 
FUNCTION zzmm_migo_pbo_header .
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_CLASS_ID) TYPE  MIGO_CLASS_ID OPTIONAL
*"  EXPORTING
*"     REFERENCE(E_CPROG) TYPE  SYCPROG
*"     REFERENCE(E_DYNNR) TYPE  SYDYNNR
*"     REFERENCE(E_HEADING) TYPE  MIGO_BADI_HEADING
*"----------------------------------------------------------------------
*BREAK HANDCXM.
  DATA gs_gohead TYPE gohead.
  CHECK i_class_id EQ zcl_im_co_mb_migo_badi=>mc_class_name.
  ref_kernel ?= <fs_kernel_class>.

  e_cprog = sy-repid.
  e_dynnr = 9000.
  e_heading = TEXT-001.

  "获取MIGO的事务类型,如果为只读或取消,则所有增强字段只能显示
  ASSIGN ref_kernel->('S_ACTION') TO FIELD-SYMBOL(<fs_action>).
  IF sy-subrc EQ 0.
    MOVE-CORRESPONDING <fs_action> TO gs_action.
  ENDIF.
  IF gs_action-display EQ abap_true OR
     gs_action-cancel EQ abap_true.
    CLEAR: gs_group.
  ELSE.
    gs_group-g01 = abap_true.
    gs_group-g02 = abap_true.
  ENDIF.

ENDFUNCTION.
ZZMM_MIGO_POST_DOCUMENT 保存数据 
FUNCTION zzmm_migo_post_document.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IS_MKPF) TYPE  MKPF
*"  TABLES
*"      IT_MSEG STRUCTURE  ZSMM017I_BADI OPTIONAL
*"----------------------------------------------------------------------
  MOVE-CORRESPONDING is_mkpf TO ztmm017.
  IF ztmm017 IS NOT INITIAL.
    MODIFY ztmm017.
  ENDIF.

  DATA:lt_ztmm017i LIKE TABLE OF ztmm017i,
       ls_ztmm017i LIKE LINE OF lt_ztmm017i.
  CLEAR lt_ztmm017i.
  LOOP AT  it_mseg INTO DATA(ls_mseg).
    CLEAR ls_ztmm017i.
    MOVE-CORRESPONDING ls_mseg TO ls_ztmm017i.
    APPEND ls_ztmm017i TO lt_ztmm017i.
  ENDLOOP.
  IF  lt_ztmm017i IS NOT INITIAL.
     MODIFY ztmm017I FROM TABLE lt_ztmm017i.
  ENDIF.


ENDFUNCTION.
ZZMM_MIGO_READ_DATA 获取MIGO数据 
FUNCTION zzmm_migo_read_data.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_LINES_IN_MODEL) TYPE  SYTABIX
*"     REFERENCE(IS_GOHEAD) TYPE  GOHEAD
*"  CHANGING
*"     REFERENCE(E_HOLD_DATA_DISABLE) TYPE  ABAP_BOOL
*"----------------------------------------------------------------------

  CHECK is_gohead-mblnr IS NOT INITIAL.

  SELECT SINGLE *
      FROM ztmm017
   WHERE mblnr EQ is_gohead-mblnr
     AND mjahr EQ is_gohead-mjahr.


ENDFUNCTION.
ZZMM_MIGO_RESET 重置MIGO数据 
FUNCTION zzmm_migo_reset.
*"----------------------------------------------------------------------
*"*"本地接口:
*"----------------------------------------------------------------------

  CLEAR: gs_action,ztmm017,zsmm017i_badi.

ENDFUNCTION.
ZZMM_MIGO_UPDATE_DATA 更新数据 
FUNCTION zzmm_migo_update_data.
*"----------------------------------------------------------------------
*"*"更新函数模块:
*"
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IS_HEADER) TYPE  ZTMM017
*"  TABLES
*"      IT_ITEM STRUCTURE  ZTMM017I OPTIONAL
*"----------------------------------------------------------------------

  IF is_header IS NOT INITIAL.
    MODIFY ztmm017 FROM is_header.
  ENDIF.

  DATA: ls_ztmm017i TYPE ztmm017i,
        lt_ztmm017i LIKE STANDARD TABLE OF ls_ztmm017i.
  IF it_item[] IS NOT INITIAL.
    LOOP AT it_item INTO DATA(is_item).
      MOVE-CORRESPONDING is_item TO ls_ztmm017i.
      APPEND ls_ztmm017i TO lt_ztmm017i.
    ENDLOOP.
    MODIFY ztmm017i FROM TABLE lt_ztmm017i.
  ENDIF.


ENDFUNCTION.
自定义屏幕:
抬头屏幕:9000

通过方法 IF_EX_MB_MIGO_BADI~PBO_HEADER指定加载抬头子屏幕信息

 

 行项目屏幕:9001

通过方法 IF_EX_MB_MIGO_BADI~PBO_DETAIL指定加载行项目子屏幕信息

Ps. 下一篇是 MB51 标准报表增强,有需求可以一起看。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值