![cover](https://img-blog.csdnimg.cn/20201118153853720.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L290NTEyY3Nkbg==,size_16,color_FFFFFF,t_70)
在SAP中使用标准表维护SM30说明
实现在SAP系统中“用户自建表的数据”在标准SM30事务代码中维护,详细的说明如下:一、新建自建表和SM30的关联SE11中输入自建表,选择菜单“实用程序”中的表维护生成器,把权限对象加上,相关设置选一个:1、使用标准SPRO管理表方案,表数据修改后可以传输。2、随意一点,自己在每个系统录入数据。二、SM30中编辑自建表数据:在SM30中输入自建表名就可以用标准的编辑界面维护自己表的数据了三、把这
标准的表维护生成器,SM30的详细说明:
一、SE11中编辑表的前提条件:
1、注意表的主键,如果没有主键,SM30中无法出现正常的界面。
2、表如果不用数据元素,表的字段文本不会显示,只会显示“+”。
3、表的编辑属性应该选X。
注意:se11开启编辑模式,才能对“表维护生成器”做编辑。
二、SE11中生成“表维护生成器”视图:
SE11中输入自建表,选择菜单“实用程序”中的表维护生成器,
1、权限对象设置为:&NC&,表示最大权限。
2、函数组填一个,界面自动会创建。
3、开发包选一个。
4、用一步法,点“查找屏幕号”界面自动填充一个屏幕。
5、“记录历程”一定要选“不,或用户,记录历程”
三、SM30中编辑自建表数据:
在SM30中输入自建表名
就可以用标准的编辑界面维护自己表的数据了
四、把表维护编辑器转为事务代码:
有时候,这个功能,我们还需要下放给用户,我们不能把SM30直接交给,因为SM30权限比较大,有了SM30,用户可以修改全部的自定义表,所以不能把SM30给用户。那有什么好的办法把这么好的功能给用户呢?
新建一个程序中调用下面函数,就可以调用“表的维护界面”了,再把程序和事务赋权给用户,这样用户就可以使用SM30里的标准表维护界面了:
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U'
* CORR_NUMBER = ' '
* GENERATE_MAINT_TOOL_IF_MISSING = ' '
* SHOW_SELECTION_POPUP = ' '
view_name = l_tablename.
五、对维护界面字段进行控制:
1、比如有个需求A,新建行数据要自动带出UID和用户名、日期、时间:
在SM30中增加一个事件
有很多事件可以选,这里选05:
2、比如有个需求B,用户修改了多行,我们要对多行数据保存到数据库前检查:
这里需要先得到一张界面的全局内表:
表数据在EXTRACT变量中,但是是全部字段合并为一行存储,需要转换一下:
FORM FRM_EVENT01 .
DATA:lt_table TYPE TABLE OF ZTSD0026C.
LOOP AT EXTRACT.
APPEND <VIM_EXTRACT_STRUC> TO lt_table.
ENDLOOP.
ENDFORM.
OK,上面的代码,我们得到了界面的表,放到 lt_table里面。
剩下的就是按自己的规则检查了,最后来一个比较复杂的规则例子,ZTSD0026C表:
*----------------------------------------------------------------------*
***INCLUDE LZTSD0026CF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_EVENT01
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_EVENT01 .
DATA:lt_table TYPE TABLE OF ZTSD0026C.
DATA:gt_excel_check TYPE TABLE OF ZTSD0026C.
DATA:gt_excel_coll TYPE TABLE OF ZTSD0026C.
LOOP AT EXTRACT.
APPEND <VIM_EXTRACT_STRUC> TO lt_table.
ENDLOOP.
CLEAR gt_excel_check.
gt_excel_check = lt_table.
"---验证1:根据导入的物料+基本车型+原选装+目标选装不允许重复,重复则报错:“在车型和原选装下目标选装重复”-----
LOOP AT gt_excel_check ASSIGNING FIELD-SYMBOL(<fs>).
<fs>-ZQUOTA = 0.
ENDLOOP.
SORT gt_excel_check by werks matnr zoptpack_o zoptpack_n.
DELETE ADJACENT DUPLICATES FROM gt_excel_check.
IF sy-subrc = 0.
MESSAGE '在车型和原选装下目标选装重复' TYPE 'E' DISPLAY LIKE 'E'.
ENDIF.
"---验证2:当次导入的物料+基本车型+原选装汇总的配额=100,不为100则报错:“总配额不足100或大于100”不允许保存-----
CLEAR gt_excel_check.
gt_excel_check = lt_table.
LOOP AT gt_excel_check ASSIGNING FIELD-SYMBOL(<fs1>).
<fs1>-zoptpack_n = ''.
ENDLOOP.
LOOP AT gt_excel_check ASSIGNING FIELD-SYMBOL(<fs3>).
COLLECT <fs3> INTO gt_excel_coll.
ENDLOOP.
LOOP AT gt_excel_coll ASSIGNING FIELD-SYMBOL(<fs2>).
IF <fs2>-ZQUOTA <> 100.
MESSAGE <fs2>-werks && ',' && <fs2>-matnr && ',' && <fs2>-zoptpack_o && ' 总配额不足100或大于100,请成对处理' TYPE 'E' DISPLAY LIKE 'E'.
" MESSAGE '666' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDLOOP.
sy-SUBRC = 0.
ENDFORM.
ZTSD0026D表:
*&---------------------------------------------------------------------*
*& 包含 LZTSD0026DF01
*&---------------------------------------------------------------------*
form frm_add_date.
ZTSD0026D-erdat = sy-datum.
ZTSD0026D-ERTIM = sy-uzeit.
ENDFORM.
更多推荐
所有评论(0)