大家新年好,这个新年格外的不一样。在家远程办公的我忙着项目上的事,加上过年就一直忘记写博客了。

今天做了一个物料主数据的增强功能

先看下效果图吧:MM02的基础数据2页签下面的增强table control

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap




1.      创建自定义表 ZMMT001 

用于存放物料主数据增强页面的数据

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_02

2.      SPRO--后勤-常规--物料主数据 -- 配置物料主记录 --  创建定制子屏幕的程序

 2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_03


2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_blidflag_042020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_05

我们在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 ,同時增加代碼

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_062020.02.15 【ABAP随笔】- 物料主数据增强 - table control_字段_07

下一步选择除了SEL其他字段,然後一直下一步

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_字段_082020.02.15 【ABAP随笔】- 物料主数据增强 - table control_主数据_09



 2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_102020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_11


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創建增强


2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_物料主数据增强_12



 点击增强分配

 2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_13


加入增强:MGA00001(仅工业版本的物料主数据,零售不在这)

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_物料主数据增强_14


点击组件修改出口



EXIT_SAPLMGMU_001   双击ZXMG0U02 回车创建包含文件

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_物料主数据增强_152020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_16


 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->后勤-常规->物料主数据->配置物料主记录->定义每个屏幕序列的数据屏幕的结构




 2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_abap_172020.02.15 【ABAP随笔】- 物料主数据增强 - table control_字段_18

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_主数据_19选择屏幕为0001的行





SAPLMGD1改为我们的函数组: SAPLZMM_FG_001

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_主数据_202020.02.15 【ABAP随笔】- 物料主数据增强 - table control_主数据_21



 保存,设置完毕.

MM03效果

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_主数据_22

6.      问题解决

(1)      当你在table control中输入数据时,回车会触发下一个页面或者保存

(2)      当你点击客制子屏幕按钮时,会报错

(TC_MM001_INSR, TC_MM001_DELE)


解决方法:在TC_MM001_USER_COMMAND INPUT执行之前增加代码

2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_字段_23


注意:这里有一个参数为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.



2020.02.15 【ABAP随笔】- 物料主数据增强 - table control_主数据_24




*&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'.