zoukankan      html  css  js  c++  java
  • 2020.02.15 【ABAP随笔】- 物料主数据增强

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

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

    先看下效果图吧: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'.

  • 相关阅读:
    Delphi 窗体失踪在最上面的代码
    Delphi 目前使用delay函数功能
    Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上
    Delphi 通过SQLite3, SQLiteTable3 操作数据库
    解决sqlite删除数据后,文件大小不变问题 转载
    delphi执行cmd命令和bat文件
    Delphi 获取sqlite中所有的表名
    delphi 获取USB口拔出和插入的状态
    深度揭密轮播插件核心代码的实现过程
    flowJS源码个人分析
  • 原文地址:https://www.cnblogs.com/jxzhu/p/12310951.html
Copyright © 2011-2022 走看看