最近接到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 标准报表增强,有需求可以一起看。