2020.02.15 【ABAP随笔】- 物料主数据增强 - table control
大家新年好,这个新年格外的不一样。在家远程办公的我忙着项目上的事,加上过年就一直忘记写博客了。
今天做了一个物料主数据的增强功能
先看下效果图吧: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'.