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

posted @ 2020-02-15 11:38  TAB_Zhu  阅读(2384)  评论(0编辑  收藏  举报