表维护视图

目录

创建表维护视图一般步骤

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.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部