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