ABAP维护视图及事件处理

主页 » SAP文库 » ABAP

作者 SAPJX 2018-03-01    1088

1. 前言

SAP中由于数据量较大,很多Add-On表都需要通过用户自行维护,一般可以直接在SE16N 数据字典上直接维护数据;

但不是每个用户都有其操作权限,而且直接在数据字典上操作数据也有所危险;

因此SAP提供了表维护视图生成器,解决了这一难题;

可以通过对数据表直接生成维护视图,然后可以在维护视图上直接维护数据。

 

2. 表维护视图生成器

在数据字典中(SE11),创建完Add-On表后,选择菜单:Utilities -> Table Maintenance Generator

打开表维护视图生成器:

view_maintenance_01_01_Generator

或者 通过T-Code:SE54进入维护视图生成器:

view_maintenance_01_02_Generate_Table_Maintenance_Dialog

选择 Generated Objects 后,点击 “Create/Change” 按钮。

 

表维护生成器如下图所示:

view_maintenance_01_03_Generator_Content

在生成器界面中,有几个关键字段:

Authorization Group :权限组

Authorization object:权限对象

Function group:扩展维护视图生成的函数

Package:开发包

Maintenance Screens:生成维护屏幕

Dialog Data Transport Details:是否传输数据记录请求

 

1) 权限组

&NC& 用户权限组,不做限制的权限组,即是说任何人都可以操作此维护视图;

如若选择其他权限组(如:AA),则需要在用户角色中分配相应的权限对象才可操作此维护视图

 

2) 扩展维护视图函数

用于SAP动态生成操作函数的函数组,在分配屏幕时,会将屏幕挂在该函数组中;

生成成功后,打开函数组,则可以看到以表名称生成的两个关键的函数:

TABLEFRAME_

TABLEPROC_

以TABLEFRAME 开头的函数为视图创建了加载视图的容器框架,包括:菜单、表格容器等屏幕框架元素;

以TABLEPROC开头的函数则为视图在数据字典中获取数据,包括:动态获取表名称、字段、数据库记录等记录。

 

3) 维护屏幕

操作屏幕的生成,SAP允许在同一个函数组中生成多个维护视图,然后通过屏幕号区别开来;

提供有单个屏幕和两个屏幕操作:

单个屏幕则在新建与修改时,直接在表格上直接维护数据;

两个屏幕则在新建与修改时,多出一个编辑记录屏幕出来,显示时仍然以列表形式显示。

这里主要以客户操作习惯进行选择创建。

 

4) 维护视图数据请求

如若在开发机上维护的数据需要挂请求时,选择第一项后,在维护数据时,会弹出请求号的对话框供用户创建请求;

如若不需要对维护视图上的数据传输请求,则选择第二项。

 

3. 修改屏幕

在维护视图中,有些字段需要对其进行限制,简单一些譬如:必输、只读等操作;

或者需要在输入栏位的同时,后面相对应有关联的栏位自动带出等,都可以直接在屏幕上修改。

 

a.限制屏幕字段

点击表维护生成器上的屏幕链接:

view_maintenance_01_04_Maintenance_Screens

然后切换到 元素清单(Element List)下面的 特殊属性(Special Attribute)标签页:

view_maintenance_01_05_Screen_Element_List

在Input栏位可以对相应的字段进行修改。包括有4种状态可供选择:

Not Possible:  不可输

Required:必输

Recommended:只读

Possible:可输入

 

注意:如若屏幕表格需要调整,也可直接点击“格式”,编辑屏幕格式。

 

b. 自动带出栏位内容

想要在维护视图上逻辑,可以有两种方法:

一种是在Flow Logic中直接添加 Module;

一种是在维护视图添加事件。

 

这里推荐使用第二种,能保证数据完整和正确性;

因为第一种的话,当需要对Add-On表添加或者删除字段时,在更新维护视图时候,会覆盖Flow Logic中的程序。

因此最佳效果还是使用事件更为妥当。

关于事件的操作可以查看文章《SAP维护视图(2)-表维护视图事件处理》内容。

 

当然,如果一些简单的操作,而且保证数据表结构变动不大的,可以在Flow Logic中添加程序。

操作很简单,直接在 Extract 数据集中,添加 Module,例如通过输入客户编号自动带出客户名称:

view_maintenance_01_06_Flow_Logic

 

然后在Module中直接通过屏幕元素获取数据:

view_maintenance_01_07_Sceen_Moule

 

4. 为视图创建事务码

在SE93中,创建T-Code时,选择参数事务(Parameter Transaction):

view_maintenance_01_08_Create_Transaction

a.在屏幕上输入查看维护视图的事务码:SM30;

b.勾选跳过启动屏幕;

c. 在默认值表格上维护视图名称与显示或更新标识:

SHOW – 默认显示

EDIT – 默认可编辑

view_maintenance_01_09_Change_Parameter_Transaction

保存即可完成事务码的创建。

上篇文章简单介绍了表维护视图的生成,也提及到视图事件的扩展,这里主要讲述也是关于视图的事件处理。

当为表生成了维护视图后,在用户操作体验时,总是会出现一些很莫名的需求;

然而很多时候明明在维护视图上能做到,但往往却退而求其次的额外开发新的程序去维护数据。

不仅浪费时间又浪费资源,会出现这种尴尬的情况,主要还是对表维护生成器的不熟悉导致的。

 

以下是笔者以前遇到过的一些常用的客户需求:

需求一,输入客户编码后自动带出客户名称、输出物料自动带出物料描述 …… (这个上篇文章提过,也是最经常出现的需求)

需求二,输入日期后,根据逻辑自动算出截止日期

需求三,在维护视图中批量导入/导出数据

需求四,进入维护视图前,对数据进行条件筛选

需求五,针对不同操作人员,显示不同的数据

需求六,……

类似的需求还有很多,这里就不一一列举,但归根结底,很多需求都可以通过维护视图事件来解决。

 

2. 维护视图相关函数

在讲述维护视图的事件之前,先看下表维护生成器几个重要的Function Module:

01). VIEW_MAINTENANCE_CALL – 调用维护视图函数

02). VIEW_GET_DDIC_INFO – 获取数据字典信息

03). VIEW_AUTHORITY_CHECK – 检查权限

04). VIEW_MAINTENANCE – 调用生成的扩展维护视图

05). VIEW_ENQUEUE – 视图加锁/解锁

其中,VIEW_MAINTENANCE_CALL函数是维护视图的入口函数,包含几个部分内容:

通过VIEW_GET_DDIC_INFO函数抓取数据字典中的结构信息来填充视图框架结构(即:Table Control 数据填充);

通过VIEW_AUTHORITY_CHECK函数对操作用户进行授权检查;

通过VIEW_MAINTENANCE 函数调用生成的扩展维护视图,即动态调用生成维护视图的函数组中以TABLEFRAME_开头的函数;

在操作过程中通过 VIEW_ENQUEUE 函数对操作视图加锁,操作结束时,进行解锁。

 

3.事件处理

维护视图中的事件有38个,其中附加事件28个,替换事件10个,分别是:

附加事件(Additional events):

Event 01 before saving the data in the data

Event 02 after saving the data in the database

Event 03 before deleting the display data

Event 04 after deletion of the display data

Event 05 when inserting a new entry

Event 06 after complete execution of Function ‘Get Original’

Event 07 before correcting the contents of a selected field

Event 08 after correcting the contents of a specified field

Event 09 after ‘Get Original’ of a single entry

Event 10 after creating change request header entries

Event 11 after changing a key entry in the change request

Event 12 after changing the key entries in the change request

Event 13 end of processing (leaving the main Function Module)

Event 14 after lock/unlock in the main Function Module

Event 15 before retrieving deleted entries

Event 16 after recovering deleted entries

Event 17 before printing entries

Event 18 after checking whether the data have been changed

Event 19 after the initialization of global variables, field symbols, and so on

Event 20 after input in date subscreen (time-dep.tables/views)

Event 21 fill hidden fields

Event 22 Go TO long text maintenance for other languages

Event 23 before calling the address maintenance screen

Event 24 After restricting an entry (time-dep. tab./views)

Event 25 at start of maintenance dialog

Event 26 before displayed data is output in a list

Event 27 after filling a GUID field

Event 28 after entering a date restriction for time-dep. views

 

替换事件(Replacement events):

Event AA instead of the standard routine for reading data

Event AB instead of the standard database change routine

Event AC instead of standard routine for ‘Get Original’

Event AD (Instead of standard RO field read routine)

Event AE instead of the standard positioning code

Event AF Instead of reading in texts in other languages

Event AG Instead of ‘Get original’ for texts in other languages

Event AH instead of database changes for texts in other languages

Event ST Name of the host program for the GUI menu

Event AI Internal use only

 

具体每个事件的操作可以查看相关说明文档:
http://help.sap.com/saphelp_nw73/helpdata/en/4d/d57dc3310c0f29e10000000a15822b/content.htm

 

当为维护视图添加事件后,可以在透明表TVMIF中看到视图所定义的事件名称。

事件标识,也可以在结构VIMDESC中找到相应的对应关系;

在标准程序中,位于 VIEW_GET_DDIC_INFO 函数,其中的对应关系如下所示:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
* 1. Get events
***********************************************************************
  LOOP AT tvimf_tab.
    CASE tvimf_tab-event.
      WHEN '01'. MOVE tvimf_tab-formname TO x_header-frm_bf_sav.
      WHEN '02'. MOVE tvimf_tab-formname TO x_header-frm_af_sav.
      WHEN '03'. MOVE tvimf_tab-formname TO x_header-frm_bf_del.
      WHEN '04'. MOVE tvimf_tab-formname TO x_header-frm_af_del.
      WHEN '05'. MOVE tvimf_tab-formname TO x_header-frm_on_new.
      WHEN '06'. MOVE tvimf_tab-formname TO x_header-frm_af_org.
      WHEN '07'. MOVE tvimf_tab-formname TO x_header-frm_bf_rpl.
      WHEN '08'. MOVE tvimf_tab-formname TO x_header-frm_af_rpl.
      WHEN '09'. MOVE tvimf_tab-formname TO x_header-frm_on_org.
      WHEN '10'. MOVE tvimf_tab-formname TO x_header-frm_e071.
      WHEN '11'. MOVE tvimf_tab-formname TO x_header-frm_e071ks.
      WHEN '12'. MOVE tvimf_tab-formname TO x_header-frm_e071ka.
      WHEN '13'. MOVE tvimf_tab-formname TO x_header-frm_bf_end.
      WHEN '14'. MOVE tvimf_tab-formname TO x_header-frm_af_enq.
      WHEN '15'. MOVE tvimf_tab-formname TO x_header-frm_bf_udl.
      WHEN '16'. MOVE tvimf_tab-formname TO x_header-frm_af_udl.
      WHEN '17'. MOVE tvimf_tab-formname TO x_header-frm_bf_prn.
      WHEN '18'. MOVE tvimf_tab-formname TO x_header-frm_af_chk.
      WHEN '19'. MOVE tvimf_tab-formname TO x_header-frm_af_ini.
      WHEN '20'. MOVE tvimf_tab-formname TO x_header-frm_in_dss.
      WHEN '21'. MOVE tvimf_tab-formname TO x_header-frm_h_flds.
      WHEN '22'. MOVE tvimf_tab-formname TO x_header-frm_tltext.
      WHEN '23'. MOVE tvimf_tab-formname TO x_header-frm_bf_adr.
      WHEN '24'. MOVE tvimf_tab-formname TO x_header-frm_af_dlm.
      WHEN '25'. MOVE tvimf_tab-formname TO x_header-frm_on_aut.
      WHEN '26'. MOVE tvimf_tab-formname TO x_header-frm_bf_alv. "UF
      WHEN '27'. MOVE tvimf_tab-formname TO x_header-frm_af_uid. "UF
      WHEN 'AA'. MOVE tvimf_tab-formname TO x_header-frm_rp_get.
      WHEN 'AB'. MOVE tvimf_tab-formname TO x_header-frm_rp_upd.
      WHEN 'AC'. MOVE tvimf_tab-formname TO x_header-frm_rp_org.
      WHEN 'AD'. MOVE tvimf_tab-formname TO x_header-frm_rp_cpl.
      WHEN 'AE'. MOVE tvimf_tab-formname TO x_header-frm_rp_pos.
      WHEN 'AF'. MOVE tvimf_tab-formname TO x_header-frm_tl_get. "SW
      WHEN 'AG'. MOVE tvimf_tab-formname TO x_header-frm_tl_org. "SW
      WHEN 'AH'. MOVE tvimf_tab-formname TO x_header-frm_tl_upd. "SW
      WHEN 'AI'. MOVE tvimf_tab-formname TO x_header-frm_bf_alv. "UF
      WHEN 'ST'. MOVE tvimf_tab-formname TO x_header-gui_prog.
    ENDCASE.
  ENDLOOP.

 

便于在编辑程序时,找寻哪个事件用于什么位置,引用上下文内容等好处。

例如,如果定义了AB (Instead of the standard database change routine) 事件,

在程序中,就能直接找到调用增加的事件:

table_maintenance_view_02_01_Event_AB

 

3. 添加维护视图事件

添加维护视图事件的操作比较简单,通过生成器生成视图后,选择菜单:Environment -> Modification -> Events

table_maintenance_view_02_02_Event_Menu

进入事件界面,在工具栏上点击  添加新条目(New Entries),即可添加事件:

table_maintenance_view_02_03_Add_Event

在第一个栏位上选择事件,然后在FORM Routine中输入自定义事件的Subroutine名称。

table_maintenance_view_02_03_Select_Event

这里需要说明的是,添加的事件程序,是通过执行Form操作的,因此在编辑事件程序时,可以包含在Include文件中。

添加成功后,再点击编辑,把其保存到新的Include文件,即可对该事件添加程序:

table_maintenance_view_02_04_Event_Editor

  

4. 维护视图事件处理示例

步骤一,新建Add-On表并输入各字段内容:

table_maintenance_view_02_05_Demo_Create_Add_On

步骤二,维护技术参数,保存数据表并激活;

步骤三,生成维护视图:

table_maintenance_view_02_06_Demo_Table_Maintenance_Generation_Environment

步骤四,添加事件并保存:

table_maintenance_view_02_07_Demo_Add_Event_05

步骤五,点击编辑器编辑事件:

table_maintenance_view_02_08_Demo_Event_05

输入客户编号、物料编码时,自动带出客户名称与物料描述。

 

输出效果:

table_maintenance_view_02_09_Demo_Event_05_show1

回车后,自动带出描述:

table_maintenance_view_02_10_Demo_Event_05_show2

 

步骤六,添加事件21

由于事件05是添加新条目时触发的事件,当在更新数据时,并不会触发事件;

因此,需要添加事件21,这样在栏位上输入值时,可以对其栏位进行校验或者取数:

table_maintenance_view_02_11_Demo_Add_Event_21

在程序上添加自动带出物料描述:

table_maintenance_view_02_12_Demo_Event_21

这样在编辑状态时,会自动带出物料描述;

另外,客户编码是该表的主键,不可编辑,因此只需要带出物料描述。

本文原始地址:http://sapdoc.cn/sap/theme/81.html

转载请注明出处来自 SAP文库

上一篇

AA固定资产|概述

下一篇

SAP Barcode条形码开发方案