# ABAP随笔-物料主数据界面增强
原创 Tab Zhu [ SAP TAB ](javascript:void\(0\);)
__ _ _ _ _
**点击蓝字关注我们**
富强 民主 文明 和谐
自由 平等 公正 法制
爱国 敬业 诚信 友善
_**01** _
**物料主数据界面增强**
**不念过** **去**
**START**
**不畏将来**
大家新年好,这个新年格外的不一样。在家远程办公的我忙着项目上的事,加上过年就一直忘记写随笔了。果然是一个佛系得运营,今天来个长一点得文章哈。
做了一个物料主数据的增强功能
先看下效果图吧:MM02的基础数据2页签下面的增强table control
## 1\. 创建自定义表 ZMMT001
用于存放物料主数据增强页面的数据
## 2\. SPRO--后勤-常规--物料主数据 -- 配置物料主记录 -- 创建定制子屏幕的程序
我们在SE80中看到所创建的函数组
LZMM_FG_001TOP 的定义
---
DATA : ok_code LIKE sy \- ucomm . TYPES : BEGIN OF ty_zmmt001 ,
sel TYPE checkbox ,
matnr TYPE zmmt001 \- matnr ,
id TYPE zmmt001 \- id ,
f1 TYPE zmmt001 \- f1 ,
f2 TYPE zmmt001 \- f2 ,
f3 TYPE zmmt001 \- f3 ,
END OF ty_zmmt001 .DATA gt_zmmt001 TYPE TABLE OF ty_zmmt001 .
DATA gs_zmmt001 TYPE ty_zmmt001 .
DATA GV_GET_MATNR_FLAG TYPE C . _ " _
## 3\. 在屏幕0001上創建需要的字段
双击0001屏幕,点击布局
我们画一个table control ,同時增加代碼
下一步选择除了SEL其他字段,然后一直下一步
Table control 创建完毕如下:
0001畫面代碼如下
PROCESS BEFORE OUTPUT.
_ * _ _ 当 _ _ TCODE _ _ 为 _ _ MM02 MM03 _ _ 时需要获取数据 _
MODULE get_data .
_ *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TC_MM001' _
MODULE tc_mm001_change_tc_attr .
_ *&SPWIZARD: MODULE TC_MM001_CHANGE_COL_ATTR. _
LOOP AT gt_zmmt001INTO gs_zmmt001
WITH CONTROL tc_mm001
CURSOR tc_mm001 \- current_line .
MODULE tc_mm001_get_lines .
_ *&SPWIZARD: MODULE TC_MM001_CHANGE_FIELD_ATTR _
ENDLOOP .PROCESS AFTER INPUT .
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TC_MM001'
LOOP AT G_TC_MM001_ITAB .CHAIN .
FIELD ZMMT001 \- MANTR .
FIELD ZMMT001 \- ID .
FIELD ZMMT001 \- F1 .
FIELD ZMMT001 \- F2 .
FIELD ZMMT001 \- F3 .
MODULE TC_MM001_MODIFY ON CHAIN \- REQUEST .
ENDCHAIN .
ENDLOOP . _ " _ _ 当触发子屏幕按钮或者滚轮时,不触发回车按钮及其他按钮 _MODULE ubildflag_x_command .
MODULE TC_MM001_USER_COMMAND .
*&SPWIZARD: MODULE TC_MM001_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TC_MM001_CHANGE_COL_ATTR.
MODULE ASSIGN_DATA .
---
_ *&\---------------------------------------------------------------------* _
_ *& Module GET_DATA OUTPUT _
_ *&\---------------------------------------------------------------------* _
_ *& _
_ *&\---------------------------------------------------------------------* _
MODULE get_data OUTPUT .
GET PARAMETER ID 'MAT' FIELD DATA ( gv_matnr ).
IF ( sy \- tcode = 'MM02' OR sy \- tcode = 'MM03' ) ANDgv_get_matnr_flag IS INITIAL .
SELECT * FROM zmmt001INTO CORRESPONDING FIELDS OF TABLE gt_zmmt001
WHERE matnr = gv_matnr .
gv_get_matnr_flag = 'X' .
ENDIF .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' .
screen \- input = '0' .
ENDIF .
MODIFY SCREEN .
ENDLOOP .
ENDMODULE ._ *&\---------------------------------------------------------------------* _
_ *& Module UBILDFLAG_X_COMMAND INPUT _
_ *&\---------------------------------------------------------------------* _
_ * text _
_ *----------------------------------------------------------------------* _
MODULE ubildflag_x_command INPUT .
DATA LV_FIELD TYPE FIELDNAME .
GET CURSOR FIELD LV_FIELD .
_ " _ _ 控制当对 _ _ TABLE CONTROL _ _ 中操作时,不触发回车保存 _ _ / _ _ 回车下一个页签 _ _ /
_ _ 按键报错 _
IF sy \- ucomm = 'TC_MM001_INSR'OR sy \- ucomm = 'TC_MM001_DELE' OR ( SY \- UCOMM = 'ENTR' OR SY
\- UCOMM = SPACE AND LV_FIELD CS 'GS_ZMMT001' ).
FIELD-SYMBOLS <fs_bildflag> TYPE kzref .
ASSIGN ( '(SAPLMGMI)UBILDFLAG' ) TO <fs_bildflag> .
IF <fs_bildflag> IS ASSIGNED .<fs_bildflag> = 'X' .
ENDIF .
ENDIF .ENDMODULE ._ *&\---------------------------------------------------------------------* _
_ *& Module ASSIGN_DATA INPUT _
_ *&\---------------------------------------------------------------------* _
_ * text _
_ *----------------------------------------------------------------------* _
MODULE assign_data INPUT .
DATA lt_zmmt001 TYPE TABLE OF zmmt001 .
LOOP AT gt_zmmt001 ASSIGNING FIELD \- SYMBOL ( <fs_1> ).<fs_1> \- matnr = gv_matnr .
<fs_1> \- id = sy \- tabix .
ENDLOOP .MOVE-CORRESPONDING gt_zmmt001 TO lt_zmmt001 .
EXPORT zmmt001 = lt_zmmt001 TO MEMORY ID 'MERY_ZMMT001' .
ENDMODULE .##
4\. CMOD 創建增强
点击增强分配
加入增强 :MGA00001 (仅工业版本的物料主数据,零售不在这)
点击组件修改出口
EXIT_SAPLMGMU_001 双击 ZXMG0U02 回车 创建包含文件
_ *&\---------------------------------------------------------------------* _
_ *& _ _ 包含 _ _ ZXMG0U02 _
_ *&\---------------------------------------------------------------------* _
DATA lt_zmmt001 TYPE TABLE OF zmmt001 .
IF sy \- ucomm = 'BU' OR sy \- ucomm = 'YES' .
IMPORT zmmt001 = lt_zmmt001 FROM MEMORY ID 'MERY_ZMMT001' .DELETE FROM zmmt001 WHERE matnr = wmara \- matnr .
CHECK lt_zmmt001[] IS NOT INITIAL .
MODIFY zmmt001 FROM TABLE lt_zmmt001[] .COMMIT WORK .
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 执行之前 增加代码
.textContent = new Date().getFullYear();