- 继上次抬头屏幕增强(MIGO 抬头屏幕自定义字段增强示例),本文章演示行项目增强示例
- 实现思路参考标准 MB_MIGO_BADI 增强示例类:CL_EXM_IM_MB_MIGO_BADI
1.创建增强数据表 & 增强结构
- 创建增强数据存储表
- 创建增强数据结构
- 创建增强数据表类型结构
2.创建增强屏幕
- 新建Function Group,定义全局变量(本章继续使用抬头增强的Function Group)
- 创建数据处理函数
- ZMM_I_GET_DATA(行项目:从屏幕获取数据)
- ZMM_I_SET_DATA(行项目:输出数据到屏幕)
- ZMM_UPDATE_DATA(抬头/行项目:更新数据到数据库 )
- ZMM_SET_GOACTION(抬头/行项目:设置屏幕Action Code)
3.创建行项目增强子屏幕9002
- 创建屏幕
- 创建屏幕字段
- 创建PBO处理逻辑
4.创建BADI实施
- SE19 创建BADI实施
- 新增实施类属性
- IF_EX_MB_MIGO_BADI~INIT
METHOD IF_EX_MB_MIGO_BADI~INIT.
APPEND GF_CLASS_ID TO CT_INIT.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~PBO_DETAIL
METHOD IF_EX_MB_MIGO_BADI~PBO_DETAIL.
IF GF_CLASS_ID = I_CLASS_ID.
DATA: WA_ITEM TYPE ZSMM_I_MIGO01.
CHECK I_LINE_ID IS NOT INITIAL.
E_CPROG = 'SAPLZMM_G_001'(001). "'SAPL + 'FG Name'
E_DYNNR = '9002'.
E_HEADING = 'Item Addition1'.
G_LINE_ID = I_LINE_ID.
READ TABLE IT_ITEM INTO WA_ITEM WITH KEY LINE_ID = I_LINE_ID.
CALL FUNCTION 'ZMM_I_SET_DATA'
EXPORTING
I_INPUT = WA_ITEM.
ENDIF.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~PAI_DETAIL
METHOD IF_EX_MB_MIGO_BADI~PAI_DETAIL.
DATA: WA_ITEM_NEW TYPE ZSMM_I_MIGO01,
WA_ITEM_OLD TYPE ZSMM_I_MIGO01.
CHECK I_LINE_ID <> 0.
CALL FUNCTION 'ZMM_I_GET_DATA'
IMPORTING
E_OUTPUT = WA_ITEM_NEW.
READ TABLE IT_ITEM INTO WA_ITEM_OLD WITH KEY LINE_ID = I_LINE_ID.
IF WA_ITEM_NEW <> WA_ITEM_OLD.
E_FORCE_CHANGE = 'X'.
ENDIF.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~LINE_MODIFY
METHOD IF_EX_MB_MIGO_BADI~LINE_MODIFY.
DATA: WA_ITEM_NEW TYPE ZSMM_I_MIGO01,
WA_ITEM_OLD TYPE ZSMM_I_MIGO01,
WA_ZTMM_I_MIGO01 TYPE ZTMM_I_MIGO01,
L_SUBRC TYPE SY-SUBRC.
READ TABLE IT_ITEM INTO WA_ITEM_OLD WITH KEY LINE_ID = I_LINE_ID.
L_SUBRC = SY-SUBRC.
IF SY-SUBRC <> 0.
IF CS_GOITEM-MBLNR IS NOT INITIAL
AND CS_GOITEM-MJAHR IS NOT INITIAL
AND CS_GOITEM-ZEILE IS NOT INITIAL.
SELECT SINGLE * FROM ZTMM_I_MIGO01
INTO WA_ZTMM_I_MIGO01
WHERE MBLNR = CS_GOITEM-MBLNR
AND MJAHR = CS_GOITEM-MJAHR
AND ZEILE = CS_GOITEM-ZEILE.
IF WA_ZTMM_I_MIGO01 IS NOT INITIAL.
MOVE-CORRESPONDING WA_ZTMM_I_MIGO01 TO WA_ITEM_NEW.
ENDIF.
ENDIF.
WA_ITEM_NEW-LINE_ID = I_LINE_ID.
INSERT WA_ITEM_NEW INTO TABLE IT_ITEM.
ELSE.
CHECK G_LINE_ID = I_LINE_ID.
CALL FUNCTION 'ZMM_I_GET_DATA'
IMPORTING
E_OUTPUT = WA_ITEM_NEW.
MODIFY IT_ITEM FROM WA_ITEM_NEW TRANSPORTING ZZUID ZZCTY WHERE LINE_ID = I_LINE_ID.
ENDIF.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~LINE_DELETE
METHOD IF_EX_MB_MIGO_BADI~LINE_DELETE.
DELETE IT_ITEM WHERE GLOBAL_COUNTER = I_LINE_ID.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~RESET
METHOD IF_EX_MB_MIGO_BADI~RESET.
CLEAR: IT_ITEM,
G_NO_INPUT,
G_CANCEL,
G_LINE_ID.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~POST_DOCUMENT
METHOD IF_EX_MB_MIGO_BADI~POST_DOCUMENT.
DATA: WA_ZTMM_I_MIGO01 TYPE ZTMM_I_MIGO01,
LT_ZTMM_I_MIGO01 TYPE TABLE OF ZTMM_I_MIGO01,
WA_ITEM TYPE ZSMM_I_MIGO01,
WA_MSEG TYPE MSEG.
IF IT_ITEM IS NOT INITIAL.
LOOP AT IT_ITEM INTO WA_ITEM.
IF G_CANCEL IS INITIAL.
READ TABLE IT_MSEG INTO WA_MSEG
WITH KEY LINE_ID = WA_ITEM-LINE_ID.
ELSE.
READ TABLE IT_MSEG INTO WA_MSEG
WITH KEY SMBLN = WA_ITEM-MBLNR
SMBLP = WA_ITEM-ZEILE
SJAHR = WA_ITEM-MJAHR.
ENDIF.
IF SY-SUBRC IS INITIAL.
MOVE-CORRESPONDING WA_ITEM TO WA_ZTMM_I_MIGO01.
MOVE-CORRESPONDING WA_MSEG TO WA_ZTMM_I_MIGO01.
APPEND WA_ZTMM_I_MIGO01 TO LT_ZTMM_I_MIGO01.
ENDIF.
ENDLOOP.
CALL FUNCTION 'ZMM_UPDATE_DATA' IN UPDATE TASK
TABLES
IT_ITEM = LT_ZTMM_I_MIGO01.
ENDIF.
ENDMETHOD.
- IF_EX_MB_MIGO_BADI~MODE_SET
METHOD IF_EX_MB_MIGO_BADI~MODE_SET.
*------------------------------------------------*
" i_action:
" A01 = Goods receipt
" A02 = Return delivery
" A03 = Cancellation
" A04 = Display
" A05 = Release GR bl.st.
" A06 = Subsequent deliv.
" A07 = Goods issue
"
" i_refdoc:
" R01 = Purchase order
" R02 = Material document
" R03 = Delivery note
" R04 = Inbound delivery
" R05 = Outbound delivery
" R06 = Transport
" R07 = Transport ID code
" R08 = Order
" R09 = Reservation
" R10 = Other GR
*------------------------------------------------*
IF I_ACTION = 'A03' OR I_ACTION = 'A04' .
G_NO_INPUT = ABAP_TRUE.
ENDIF.
IF I_ACTION = 'A03'.
G_CANCEL = ABAP_TRUE.
ENDIF.
CALL FUNCTION 'ZMM_SET_GOACTION'
EXPORTING
I_GOACTION = I_ACTION.
ENDMETHOD.
5.验证效果