大家新年好,這個新年格外的不一樣。在家遠程辦公的我忙着項目上的事,加上過年就一直忘記寫博客了。
今天做了一個物料主數據的增強功能
先看下效果圖吧:MM02的基礎數據2頁簽下面的增強table control
1. 創建自定義表 ZMMT001
用於存放物料主數據增強頁面的數據
2. SPRO--后勤-常規--物料主數據 -- 配置物料主記錄 -- 創建定制子屏幕的程序
我們在SE80中看到所創建的函數組
LZMM_FG_001TOP的定義
1 DATA:ok_code LIKE sy-ucomm. 2 TYPES:BEGIN OF ty_zmmt001, 3 sel TYPE checkbox, 4 matnr TYPE zmmt001-matnr, 5 id TYPE zmmt001-id, 6 f1 TYPE zmmt001-f1, 7 f2 TYPE zmmt001-f2, 8 f3 TYPE zmmt001-f3, 9 END OF ty_zmmt001. 10 11 DATA gt_zmmt001 TYPE TABLE OF ty_zmmt001. 12 DATA gs_zmmt001 TYPE ty_zmmt001. 13 14 DATA GV_GET_MATNR_FLAG TYPE C."
3. 在屏幕0001上創建需要的字段
雙擊0001屏幕,點擊布局
我們畫一個table control ,同時增加代碼
下一步選擇除了SEL其他字段,然後一直下一步
Table control 創建完畢如下:
0001畫面代碼如下
1 PROCESS BEFORE OUTPUT. 2 *當TCODE為MM02 MM03時需要獲取數據 3 MODULE get_data. 4 *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TC_MM001' 5 MODULE tc_mm001_change_tc_attr. 6 *&SPWIZARD: MODULE TC_MM001_CHANGE_COL_ATTR. 7 LOOP AT gt_zmmt001 8 INTO gs_zmmt001 9 WITH CONTROL tc_mm001 10 CURSOR tc_mm001-current_line. 11 MODULE tc_mm001_get_lines. 12 *&SPWIZARD: MODULE TC_MM001_CHANGE_FIELD_ATTR 13 ENDLOOP. 14 15 PROCESS AFTER INPUT. 16 *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TC_MM001' 17 LOOP AT G_TC_MM001_ITAB. 18 CHAIN. 19 FIELD ZMMT001-MANTR. 20 FIELD ZMMT001-ID. 21 FIELD ZMMT001-F1. 22 FIELD ZMMT001-F2. 23 FIELD ZMMT001-F3. 24 MODULE TC_MM001_MODIFY ON CHAIN-REQUEST. 25 ENDCHAIN. 26 ENDLOOP. 27 "當觸發子屏幕按鈕或者滾輪時,不觸發回車按鈕及其他按鈕 28 MODULE ubildflag_x_command. 29 MODULE TC_MM001_USER_COMMAND. 30 *&SPWIZARD: MODULE TC_MM001_CHANGE_TC_ATTR. 31 *&SPWIZARD: MODULE TC_MM001_CHANGE_COL_ATTR. 32 MODULE ASSIGN_DATA.
1 *&---------------------------------------------------------------------* 2 *& Module GET_DATA OUTPUT 3 *&---------------------------------------------------------------------* 4 *& 5 *&---------------------------------------------------------------------* 6 MODULE get_data OUTPUT. 7 8 GET PARAMETER ID 'MAT' FIELD DATA(gv_matnr). 9 10 IF ( sy-tcode = 'MM02' OR sy-tcode = 'MM03' ) AND gv_get_matnr_flag IS INITIAL. 11 SELECT * FROM zmmt001 12 INTO CORRESPONDING FIELDS OF TABLE gt_zmmt001 13 WHERE matnr = gv_matnr. 14 gv_get_matnr_flag = 'X'. 15 ENDIF. 16 ENDMODULE.
1 *&SPWIZARD: OUTPUT MODULE FOR TC 'TC_MM001'. DO NOT CHANGE THIS LINE! 2 *&SPWIZARD: GET LINES OF TABLECONTROL 3 MODULE tc_mm001_get_lines OUTPUT. 4 g_tc_mm001_lines = sy-loopc. 5 "控制不同TCODE下 字段單元格的是否可輸入 6 LOOP AT SCREEN. 7 IF screen-name CS 'GS_ZMMT001-F'. 8 CASE sy-tcode. 9 WHEN 'MM01' OR 'MM02'. 10 screen-input = '1'. 11 WHEN 'MM03'. 12 screen-input = '0'. 13 WHEN OTHERS. 14 ENDCASE. 15 ENDIF. 16 17 IF screen-name = 'GS_ZMMT001-MATNR' OR screen-name = 'GS_ZMMT001-ID'. 18 screen-input = '0'. 19 ENDIF. 20 MODIFY SCREEN. 21 ENDLOOP. 22 ENDMODULE.
1 *&---------------------------------------------------------------------* 2 *& Module UBILDFLAG_X_COMMAND INPUT 3 *&---------------------------------------------------------------------* 4 * text 5 *----------------------------------------------------------------------* 6 MODULE ubildflag_x_command INPUT. 7 DATA LV_FIELD TYPE FIELDNAME. 8 9 GET CURSOR FIELD LV_FIELD. 10 "控制當對TABLE CONTROL 中操作時,不觸發回車保存/回車下一個頁簽/按鍵報錯 11 IF sy-ucomm = 'TC_MM001_INSR' 12 OR sy-ucomm = 'TC_MM001_DELE'OR ( SY-UCOMM = 'ENTR' OR SY-UCOMM = SPACE AND LV_FIELD CS 'GS_ZMMT001'). 13 FIELD-SYMBOLS <fs_bildflag> TYPE kzref. 14 ASSIGN ('(SAPLMGMI)UBILDFLAG') TO <fs_bildflag>. 15 IF <fs_bildflag> IS ASSIGNED. 16 <fs_bildflag> = 'X'. 17 ENDIF. 18 ENDIF. 19 20 ENDMODULE. 21 *&---------------------------------------------------------------------* 22 *& Module ASSIGN_DATA INPUT 23 *&---------------------------------------------------------------------* 24 * text 25 *----------------------------------------------------------------------* 26 MODULE assign_data INPUT. 27 DATA lt_zmmt001 TYPE TABLE OF zmmt001. 28 29 LOOP AT gt_zmmt001 ASSIGNING FIELD-SYMBOL(<fs_1>). 30 <fs_1>-matnr = gv_matnr. 31 <fs_1>-id = sy-tabix. 32 ENDLOOP. 33 34 MOVE-CORRESPONDING gt_zmmt001 TO lt_zmmt001. 35 36 EXPORT zmmt001 = lt_zmmt001 TO MEMORY ID 'MERY_ZMMT001'. 37 ENDMODULE.
4. CMOD創建增強
點擊增強分配
加入增強:MGA00001(僅工業版本的物料主數據,零售不在這)
點擊組件修改出口
EXIT_SAPLMGMU_001 雙擊ZXMG0U02 回車創建包含文件
1 *&---------------------------------------------------------------------* 2 *& 包含 ZXMG0U02 3 *&---------------------------------------------------------------------* 4 DATA lt_zmmt001 TYPE TABLE OF zmmt001. 5 IF sy-ucomm = 'BU' OR sy-ucomm = 'YES'. 6 IMPORT zmmt001 = lt_zmmt001 FROM MEMORY ID 'MERY_ZMMT001'. 7 DELETE FROM zmmt001 WHERE matnr = wmara-matnr. 8 9 CHECK lt_zmmt001[] IS NOT INITIAL. 10 11 MODIFY zmmt001 FROM TABLE lt_zmmt001[]. 12 13 COMMIT WORK. 14 15 ENDIF.
5. spro->后勤-常規->物料主數據->配置物料主記錄->定義每個屏幕序列的數據屏幕的結構
選擇屏幕為0001的行
將SAPLMGD1改為我們的函數組: SAPLZMM_FG_001
保存,設置完畢.
MM03效果
6. 問題解決
(1) 當你在table control中輸入數據時,回車會觸發下一個頁面或者保存
(2) 當你點擊客制子屏幕按鈕時,會報錯
(TC_MM001_INSR, TC_MM001_DELE)
解決方法:在TC_MM001_USER_COMMAND INPUT執行之前增加代碼
注意:這里有一個參數為UBILDFLAG 若這個值為空,則程序會去T133E,T133D表中搜索你點擊的按鈕,
或者回車時會造成頁簽跳轉/直接保存。
1 *&---------------------------------------------------------------------* 2 *& Module UBILDFLAG_X_COMMAND INPUT 3 *&---------------------------------------------------------------------* 4 * text 5 *----------------------------------------------------------------------* 6 MODULE ubildflag_x_command INPUT. 7 DATA LV_FIELD TYPE FIELDNAME. 8 9 GET CURSOR FIELD LV_FIELD. 10 "控制當對TABLE CONTROL 中操作時,不觸發回車保存/回車下一個頁簽/按鍵報錯 11 IF sy-ucomm = 'TC_MM001_INSR' 12 OR sy-ucomm = 'TC_MM001_DELE'OR ( SY-UCOMM = 'ENTR' OR SY-UCOMM = SPACE AND LV_FIELD CS 'GS_ZMMT001'). 13 FIELD-SYMBOLS <fs_bildflag> TYPE kzref. 14 ASSIGN ('(SAPLMGMI)UBILDFLAG') TO <fs_bildflag>. 15 IF <fs_bildflag> IS ASSIGNED. 16 <fs_bildflag> = 'X'. 17 ENDIF. 18 ENDIF. 19 ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_MM001'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE tc_mm001_get_lines OUTPUT.
g_tc_mm001_lines = sy-loopc.
"控制不同TCODE下 字段單元格的是否可輸入
LOOP AT SCREEN.
IF screen-name CS 'GS_ZMMT001-F'.
CASE sy-tcode.
WHEN 'MM01' OR 'MM02'.
screen-input = '1'.
WHEN 'MM03'.
screen-input = '0'.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF screen-name = 'GS_ZMMT001-MATNR' OR screen-name = 'GS_ZMMT001-ID'.