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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM