表维护视图
目录
创建表维护视图一般步骤
1)创建数据库表
2)创建维护视图
3)选择显示字段
4)创建表维护
5)修改table control显示控制
6)添加自定义module,为单位 维护日期 ,维护人赋值
7)SM30维护
8)为维护视图分配T-code
动态控制显示列,显示范围
1)设置组
2)写控制代码
3)调用维护视图
单元格级别编辑
视图簇View cluster的创建
1)视图簇简介
2)创建视图簇
FUNCTION 'VIEW_MAINTENANCE_CALL'详解
1)参数ACTION
2)表DBA_SELLIST
3)表EXCL_CUA_FUNCT
创建表维护视图一般步骤
1)创建数据库表
物料、工厂设置外键。

2)创建维护视图



选中MARA,关联文本表


3)选择显示字段
把文本字段维护进去

4)创建表维护


创建,报错,激活
5)修改table control显示控制
双击概述屏幕:9001,点布局

必填字段修改为必输。

把描述等字段设置为不可输入
修改列描述。(这个其实是可以动态可控的,后续再讲)

把字段显示长度调整到一半比较舒服的距离。
保存,激活。
6)添加自定义module,为单位 维护日期 ,维护人赋值




7)SM30维护

8)为维护视图分配T-code
SE93创建T-code


动态控制显示列,显示范围
有时候不同部门维护不同的列,比如财务维护财务相关的,采购维护采购相关的数据,但是又在同一个维护视图中。
当然,你可以建多个维护视图。也可以直接修改table control 动态显示列,来实现这个需求。
真正的项目里应该是判断权限对象,然后判断是否显示某些列。
这个demo里简单一些,就不同工厂显示的列不一样得了。
反正原理都一样。
以下具体步骤:
1)设置组
数量和单位,在CN1下

金额在CN3下
2)写控制代码
在PBO 加代码如下


或者在这个地方控制


其实只要你对table control 足够熟悉,想在哪儿加就在哪儿加,想控制什么就能控制什么。
但是这个时候就肯定不能使用SM30去维护了,需要建一个自定义的程序call view 来维护数据。不然同时存在CN01 CN03数据,就导致工厂控制的列都不显示了。
3)调用维护视图
SE38创建自定义程序,代码如下:
*&---------------------------------------------------------------------*
*& Report ZTEST_LING
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_LING.TABLES: ZTEST_V_LING.SELECT-OPTIONS:S_MATNR FOR ZTEST_V_LING-MATNR,S_WERKS FOR ZTEST_V_LING-WERKS OBLIGATORY.DATA: LT_SELTAB TYPE STANDARD TABLE OF VIMSELLIST.
DATA: GT_EXCLUDE TYPE TABLE OF VIMEXCLFUN,GWA_EXCLUDE TYPE VIMEXCLFUN.START-OF-SELECTION.CLEAR LT_SELTAB[].CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST'EXPORTINGFIELDNAME = 'MATNR'APPEND_CONJUNCTION = 'AND'TABLESSELLIST = LT_SELTABRANGETAB = S_MATNR.CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST'EXPORTINGFIELDNAME = 'WERKS'APPEND_CONJUNCTION = 'AND'TABLESSELLIST = LT_SELTABRANGETAB = S_WERKS.CALL FUNCTION 'VIEW_MAINTENANCE_CALL'EXPORTINGACTION = 'U'VIEW_NAME = 'ZTEST_V_LING'TABLESDBA_SELLIST = LT_SELTAB[].
执行效果:




单元格级别编辑
这个其实属于table control 技术的范畴。
比如根据table control 内容的某列的值,来判断该行某列是否可编辑等等。
在表维护视图的时候也会用到。
以下实现当物料 = 100840 的时候,日期字段不可编辑。
在loop里面,这个位置添加一个module。

添加如下代码:
*----------------------------------------------------------------------*
***INCLUDE LZTEST_V_LINGO03.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module MDL_CONTRL_INPUT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE MDL_CONTRL_INPUT OUTPUT.DATA:LV_MATRN TYPE MATNR.LV_MATRN = ZTEST_V_LING-MATNR .SHIFT LV_MATRN LEFT DELETING LEADING '0'.IF LV_MATRN = '100840'.LOOP AT SCREEN.IF SCREEN-NAME = 'ZTEST_V_LING-DATUM'.SCREEN-INPUT = 0. "不可输入状态MODIFY SCREEN.ENDIF.ENDLOOP.ENDIF.
ENDMODULE.
执行效果:

但是,到这里还没有结束,你如果编辑这个字段,然后点保存,发现修改的不起作用。
所以如果想保存编辑字段的值。还需要做下面的处理。
针对这个字段加一个on request module。(根本不用加,就注释之前的自动日期赋值就可以了)

把之前的自动日期赋值给注释掉。
代码:
*----------------------------------------------------------------------*
***INCLUDE LZTEST_V_LINGI02.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module MDL_CHANGE_DATE INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE MDL_CHANGE_DATE INPUT.FIELD-SYMBOLS TYPE ANY.FIELD-SYMBOLS TYPE ANY.FIELD-SYMBOLS TYPE ANY.LOOP AT EXTRACT ASSIGNING ."按物料做主键(表维护程序前台工厂必输)ASSIGN COMPONENT 'MATNR' OF STRUCTURE TO .CHECK = ZTEST_V_LING-MATNR.ASSIGN COMPONENT 'DATUM' OF STRUCTURE TO .IF SY-SUBRC = 0. = ZTEST_V_LING-DATUM.ENDIF.ENDLOOP.
ENDMODULE.
修改日期,回车或者点保存即可。
视图簇View cluster的创建
1)视图簇简介
在SAP系统中我们经常会看到带层次结构的维护视图,尤其是在后台IMG配置中,如事务代码OKKP。其实它就是一个视图簇(View cluster),视图簇可以通过事务代码SE54将多个表维护视图按照一定的关联关系链接起来,形成层次结构,方便维护数据。

我们不妨用事务代码SE93查看上述事务代码,可以看到维护视图簇是调用了事务代码SM34,也就是说将来创建了视图簇可以用该事务代码进行维护(或者创建单独的事务代码)。

2)创建视图簇
首先得创建有层次关系的两张表,这里我们以新建采购订单的抬头/行项目表为例进行演示。
创建完成之后记得新建“表格维护生成器”(同SM30维护表一样)。

其中行项目表中的“EBELN”字段需要创建一个外键,与抬头表进行关联。

接着我们就可以通过事务代码SE54创建视图簇了。


在“对象结构”中新建输入上面创建好的两个Table,维护好它们之间的关系显示顺序。

之后先选中“ZPO_HEAD”行,点击右上角的按钮“字段相关”,完成后系统会提示“字段相关性已完成”的信息。其次选中“ZPO_ITEM”行,点击左边的“字段附属”按钮,维护好两个Table之间的对应关系(通过外键将Head表和Item表联系起来)。
最后“激活”整个操作。

之后可以通过事务代码SM34进行维护了。


FUNCTION 'VIEW_MAINTENANCE_CALL'详解
1)参数ACTION
决定调用的视图的活动(显示/维护/传输)
•S = Display
•U = Change
•T = Transport
2)表DBA_SELLIST
数据库访问选择条件
3)表EXCL_CUA_FUNCT
屏蔽视图中GUI的按钮
TABLES: MARC.
DATA: sellist TYPE TABLE OF vimsellist.
DATA: lv_ACTION TYPE char1 VALUE 'S'.DATA: it_vimexclfun TYPE TABLE OF vimexclfun,iw_vimexclfun TYPE vimexclfun.SELECT-OPTIONS: S_WERKS FOR MARC-WERKS OBLIGATORY.DATA GR_WERKS TYPE RANGE OF T001W-WERKS.SELECT WERKS INTO TABLE @DATA(LT_T001W)FROM T001W WHERE WERKS IN @S_WERKS.REFRESH GR_WERKS[].
LOOP AT LT_T001W INTO DATA(LS_T001W).AUTHORITY-CHECK OBJECT 'ZS_ZWERKS'ID 'ZWERKS' FIELD LS_T001W-WERKSID 'ACTVT' DUMMY.IF SY-SUBRC EQ 0.APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = LS_T001W-WERKS ) TO GR_WERKS.ENDIF.
ENDLOOP.
IF GR_WERKS[] IS INITIAL.MESSAGE '您没有该工厂的操作权限,请检查!' TYPE 'E'.
ENDIF.CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST' "添加第一个筛选条件EXPORTINGfieldname = 'WERKS'
* append_conjunction = 'AND'TABLESsellist = sellistrangetab = GR_WERKS. "S_WERKS.*屏蔽按钮
*iw_vimexclfun-function = 'NEWL'.
*APPEND iw_vimexclfun TO it_vimexclfun.
*iw_vimexclfun-function = 'KOPE'.
*APPEND iw_vimexclfun TO it_vimexclfun.
*iw_vimexclfun-function = 'DELE'.
*APPEND iw_vimexclfun TO it_vimexclfun.
iw_vimexclfun-function = 'AEND'.
APPEND iw_vimexclfun TO it_vimexclfun.CALL FUNCTION 'VIEW_MAINTENANCE_CALL' "调用SM30EXPORTINGaction = lv_ACTION
* CORR_NUMBER = ' '
* GENERATE_MAINT_TOOL_IF_MISSING = ' '
* SHOW_SELECTION_POPUP = ' 'view_name = 'ZVPPCPXH'
* NO_WARNING_FOR_CLIENTINDEP = ' '
* RFC_DESTINATION_FOR_UPGRADE = ' '
* CLIENT_FOR_UPGRADE = ' '
* VARIANT_FOR_SELECTION = ' 'complex_selconds_used = 'X'
* CHECK_DDIC_MAINFLAG = ' '
* SUPPRESS_WA_POPUP = ' 'TABLESdba_sellist = sellistexcl_cua_funct = it_vimexclfunEXCEPTIONSclient_reference = 1foreign_lock = 2invalid_action = 3no_clientindependent_auth = 4no_database_function = 5no_editor_function = 6no_show_auth = 7no_tvdir_entry = 8no_upd_auth = 9only_show_allowed = 10system_failure = 11unknown_field_in_dba_sellist = 12view_not_found = 13maintenance_prohibited = 14OTHERS = 15.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
