目录
FUNCTION 'VIEW_MAINTENANCE_CALL'详解
创建表维护视图一般步骤
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'
EXPORTING
FIELDNAME = 'MATNR'
APPEND_CONJUNCTION = 'AND'
TABLES
SELLIST = LT_SELTAB
RANGETAB = S_MATNR.
CALL FUNCTION 'VIEW_RANGETAB_TO_SELLIST'
EXPORTING
FIELDNAME = 'WERKS'
APPEND_CONJUNCTION = 'AND'
TABLES
SELLIST = LT_SELTAB
RANGETAB = S_WERKS.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
ACTION = 'U'
VIEW_NAME = 'ZTEST_V_LING'
TABLES
DBA_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 <LFS_LINE> TYPE ANY.
FIELD-SYMBOLS <LFS_FIELD> TYPE ANY.
FIELD-SYMBOLS <LFS_KEY> TYPE ANY.
LOOP AT EXTRACT ASSIGNING <LFS_LINE>.
"按物料做主键(表维护程序前台工厂必输)
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <LFS_LINE> TO <LFS_KEY>.
CHECK <LFS_KEY> = ZTEST_V_LING-MATNR.
ASSIGN COMPONENT 'DATUM' OF STRUCTURE <LFS_LINE> TO <LFS_FIELD>.
IF SY-SUBRC = 0.
<LFS_FIELD> = 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-WERKS
ID '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' "添加第一个筛选条件
EXPORTING
fieldname = 'WERKS'
* append_conjunction = 'AND'
TABLES
sellist = sellist
rangetab = 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' "调用SM30
EXPORTING
action = 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 = ' '
TABLES
dba_sellist = sellist
excl_cua_funct = it_vimexclfun
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.