【SAP】ABAP开发——表维护视图事件(二)

1. 前言

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

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

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

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

 

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

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

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

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

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

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

需求六,……

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

 

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

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

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

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值