抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本篇可以说是OOALV的核心篇章,因为不同于Module Pool程序,OOALV是依靠事件驱动的。所以本片详细介绍了OOALV的事件使用方法和与经常与事件一起使用的Module。

OOALV 事件类

一、事件类介绍

1.概念

ABAP OOALV是依靠事件驱动的,而ABAP的Dialog则是依靠屏幕驱动的。怎么理解这一段话?OOALV的用户操作基本都是依靠OOALV的事件类中的逻辑进行的。而Dialog中用户的操作基本都是依靠自定义屏幕中的屏幕逻辑流实现的。

二、OOALV中的Function

1.获取光标所在的单元格属性和值

(1)方法名

GET_CURRENT_CELL

(2)介绍

该方法用于返回ALV Grid控件中光标所在的单元格属性和值,若没有选择任何单元格则返回Row的值为0。返回时返回两个行和索引号,一个行是现在被选择的行和字段的索引号,另一个是输出表(内表)的行和字段索引号。设置了隐藏字段时,画面上显示的字段顺序与内表顺序不同。

(3)参数
参数 参数类型 参数说明
E_ROW I 返回ALV画面上当前单元格(光标所在单元格)的行的索引值,如果未选择任何单元格,则返回0
E_VALUE C 返回ALV画面上当前单元格的值
E_COL I 返回ALV画面上当前单元格所在列的列名
ES_ROW_ID LVC_S_ROW 返回当前行信息(Index),包含行类型(Rowtype)(如:是否合计行)
ES_COL_ID LVC_S_COL 返回当前行信息(Hierlevel),列名(Fieldname)等
ES_ROW_NO LVC_S_ROID 返回当前行信息(Row_id),包含下级行号(Sub_row_id)
(4)用例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DATA:
LV_ROW TYPE I,
LV_VALUE TYPE C,"这个值基本不使用
LV_COL TYPE I,
LS_ROW_ID TYPE LVC_S_ROW,
LS_COL_ID TYPE LVC_S_COL,
LS_ROW_NO TYPE LVC_S_ROID.

CHECK GO_ALV IS BOUND.
CALL METHOD GO_ALV->GET_CURRENT_CELL
IMPORTING
E_ROW = LV_ROW
E_VALUE = LV_VALUE
E_COL = LV_COL
ES_ROW_ID = LS_ROW_ID
ES_COL_ID = LS_COL_ID
ES_ROW_NO = LS_ROW_NO.

2.获取ALV Grid布局信息

(1)方法名

GET_FRONTEND_LAYOUT

(2)介绍

返回当前ALV Grid上设置的布局信息。

(3)参数
参数 参数类型 参数说明
ES_LAYOUT LVC_S_LAYO 当前ALV Grid上设置的布局信息
(4)用例
1
2
3
4
5
6
7
DATA:
LS_LAYOUT TYPE LVC_S_LAYO.

CHECK GO_ALV IS BOUND.
CALL METHOD GO_ALV->GET_FRONTEND_CELLS
IMPORTING
ES_LAYOUT = LS_LAYOUT.

3.返回所选多个单元格的信息

(1)方法名

GET_SELECTED_CELLS

(2)介绍

返回所选多个单元格信息。

和其他编程语言一样,既然有Get方法也就基本会有Set方法,而Set方法的效果不仅仅体现在代码层面,也可以反应在画面上。在画面上的效果其实也就和你选择一个单元格或多个单元格的效果一致。不过不一样的地方就是如果你希望在画面上显示出选择单元格的黄色选中效果则在执行完Set方法之后不可以调用ALV刷新方法。一旦调用刷新方法选中的画面效果就不显示了。

(3)参数
参数 参数类型 参数说明
ET_CELL LVC_T_CELL 存放有选择的单元格的字段名(Col_id)、行索引值(Row_id)和单元格值(Value)
(4)用例
1
2
3
4
5
6
7
DATA:
LT_CELL TYPE LVC_T_CELL.

CHECK GO_ALV IS BOUND.
CALL METHOD GO_ALV->GET_SELECTED_CELLS
IMPORTING
ET_CELL = LT_CELL.

4.返回所选列的信息

(1)方法名

GET_SELECTED_COLUMNS

(2)介绍

返回所选列的信息。

和其他编程语言一样,既然有Get方法也就基本会有Set方法,而Set方法的效果不仅仅体现在代码层面,也可以反应在画面上。在画面上的效果其实也就和你选择一列或多列的效果一致。不过不一样的地方就是如果你希望在画面上显示出选择列的黄色选中效果则在执行完Set方法之后不可以调用ALV刷新方法。一旦调用刷新方法选中的画面效果就不显示了。

(3)参数
参数 参数类型 参数说明
ET_INDEX_COLUMNS LVC_T_COL 返回列名(Fieldname)和层级结构类型(Hierlevel)
(4)用例
1
2
3
4
5
6
7
DATA:
LT_COLUMNS TYPE LVC_T_COL.

CHECK GO_ALV IS BOUND.
CALL METHOD GO_ALV->GET_SELECTED_COLUMNS
IMPORTING
ET_INDEX_COLUMNS = LT_COLUMNS.

5.返回所选行的信息

(1)方法名

GET_SELECTED_ROWS

(2)介绍

返回在OOALV界面左侧点击一个或多个行选择按钮的行信息

和其他编程语言一样,既然有Get方法也就基本会有Set方法,而Set方法的效果不仅仅体现在代码层面,也可以反应在画面上。在画面上的效果其实也就和你选择一行或多行的效果一致。不过不一样的地方就是如果你希望在画面上显示出选择行的黄色选中效果则在执行完Set方法之后不可以调用ALV刷新方法。一旦调用刷新方法选中的画面效果就不显示了。

(3)参数
参数 参数类型 参数说明
ET_INDEX_ROWS LVC_T_ROW 返回行类型(Rowtype)和行的索引(Index)
(4)用例
1
2
3
4
5
6
7
DATA:
LT_ROWS TYPE LVC_T_ROW.

CHECK GO_ALV IS BOUND.
CALL METHOD GO_ALV->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_ROWS.

6.刷新方法

(1)方法名

REFRESH_TABLE_DISPLAY

(2)介绍

当内表在执行完事件或对页面有更改的操作后,调用该方法将内表的内容重新加载到页面上,但并不是只要执行完事件就需要调用该方法,具体的情况需要具体分析。

(3)参数
参数 参数类型 参数说明
IS_STABLE LVC_S_STB1 用于设置刷新时行和列保持不变的参数
I_SOFT_REFESH CHAR01 设置排序、筛选和求和等布局不变的参数
(4)用例
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA:
LS_STABLE TYPE LVC_S_STB1,
LV_SOFT_REFRESH TYPE CHAR01.

CHECK GO_ALV IS BOUND.
LS_STABLE-ROW = 'X'."刷新后行保持不变
LS_STABLE-COL = 'X'."刷新后列保持不变
LV_SOFT_REFRESH = 'X'."刷新后保持Sort、Filter、Sum等布局设置

CALL METHOD GO_ALV->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
I_SOFT_REFESH = LV_SOFT_REFRESH.

三、ALV 事件

OOALV 是通过事件驱动的,所以事件之于OOALV就相当于人的行动和思想。没有事件进行驱动的OOALV就相当于一个不会做任何事情的人。

1.双击事件(Double Click)

(1)触发条件

当用户在ALV界面上双击某一行或单元格时触发事件。

(2)事件参数
参数 参数类型 参数说明
E_ROW LVC_S_ROW 双击行的索引
E_CLOUMN LVC_S_COL 双列的字段名
ES_ROW_NO LVC_S_ROID 行ID(ROW_ID)和下级行ID(SUB_ROW_ID)
(3)事件示例
①事件的定义
1.Double Click事件定义
②事件的实现
2.Double Click事件实现
③事件的注册
1
SET HANDLER GO_EVENTS->HANDLE_DOUBLE_CLICK FOR GO_ALV.
④事件效果演示

双击其中一行或单元格会显示你当前单击的行号。

3.Double Click事件效果演示

2.热键/单击事件(Hotspot)

(1)触发条件

当用户在ALV上点击在字段目录中设置了Hotspot属性的字段并注册该事件后会触发该事件。设置了Hotspot属性的字段会在其内容下添加下划线,类似于HTML中添加了a标签和URL属性的内容。

(2)事件参数
参数 参数类型 参数说明
E_ROW_ID LVC_S_ROW 单击行的索引
E_COLUMN_ID LVC_S_COL 单击列的索引
ES_ROW_NO LVC_S_ROID 行ID和下级行ID
(3)事件示例
①事件的定义
4.Hotspot事件定义
②事件的实现
5.Hotspot事件实现
③事件的注册
1
SET HANDLER GO_EVENTS->HANDLE_HOTSPOT_CLICK FOR GO_ALV.
④事件效果演示
6.Hotspot事件效果演示

3.添加按钮事件(Toolbar)

(1)触发条件

该事件没有触发条件,或者说触发条件是在注册然后调用ALV的时候。因为该事件的作用是在ALV上添加自定义按钮。只是添加按钮而不实现按钮的逻辑。设置按钮的逻辑是通过USER COMMAND事件进行设置的。

(2)事件参数
参数 参数类型 参数说明
E_OBJECT CL_ALV_EVENT_TOOLBAR_SET ALV TOOLBAR对象
E_INTERACTIVE CHAR01 交互式调用与否
(3)事件示例
①事件的定义
7.Toolbar事件定义
②事件的实现
8.Toolbar事件实现
③事件的注册
1
SET HANDLER GO_EVENTS->HANDLE_TOOLBAER FOR GO_ALV.
④事件效果演示
9.Toolbar事件效果演示

4.按钮响应事件(User Command)

(1)触发条件

当点击Toolbar事件添加的自定义按钮时触发。相关的事件还有AFTER_USER_COMMAND和BEFORE_USER_COMMAND。该事件只有一个参数E_UCOMM。该参数存放的是在添加自定按钮时的Function Code。

(2)事件参数
参数 参数类型 参数说明
E_UCOMM E_UCOMM 接收Toolbar按钮返回的Function Code
(3)事件示例
①事件的定义
10.User Command事件定义
②事件的实现
11.User Command事件实现
③事件的注册
1
SET HANDLER GO_EVENTS->HANDLE_USER_COMMAND FOR GO_ALV.
④事件效果演示
12.User Command事件效果演示

5.修改事件(Data Change)

(1)触发条件

在ALV中编辑完数据后,按Enter键或移动光标触发。但是这个触发条件有个前提,就是需要注册Enter键和光标移动事件。如果不注册这两个相应事件,Data Change事件依然不会触发。

(2)事件参数
参数 参数类型 参数说明
ER_DATA_CHANGED CL_ALV_CHANGED_DATA_PROTOCOL ALV Data Change对象,包含了变更后的数据信息
E_ONF4 CHAR01 变更后是否由搜索帮助触发
E_ONF4_BEFORE CHAR01 变更后是否由搜索帮助触发(事前)
E_ONF4_AFTER CHAR01 变更后是否由搜索帮助触发(事后)
E_UCOMM SY-UCOMM 由屏幕上的按钮触发,返回该按钮的Function Code

虽然参数众多,但是实际使用过程中只会使用第一个参数,ER_DATA_CHANGED。因为该对象内部才存有修改后的数据信息。

(3)事件示例
①事件的定义
13.Data Change事件定义
②事件的实现
14.Data Change事件实现
③事件的注册
15.Data Change事件注册

6.TOP OF PAGE事件

(1)触发条件

和Toolbar事件一样,没有触发条件,或者说触发条件是调用ALV组件的时候。

(2)事件参数
参数 参数类型 参数说明
E_DYNDOC_ID CL_DD_DOCUMENT 动态文件
TABLE_INDEX SYINDEX Loops,Current Loop Pass
(3)事件示例
①事件的定义
16.TOP OF PAGE事件的定义
②事件的实现
17.TOP OF PAGE事件的实现
③事件的注册
18.TOP OF PAGE事件的注册
④事件效果演示
19.TOP OF PAGE事件的演示

7.搜索帮助事件(Onf4)

(1)触发条件

此处是用于设置OOALV单元格中搜索帮助的事件。

(2)事件参数
参数 参数类型 参数说明
E_FIELDNAME LVC_FNAME 字段的名称
ES_ROW_NO LVC_S_ROID 行ID(ROW_ID)
ER_EVENT_DATA CL_ALV_EVENT_DATA 事件数据
(3)事件示例
①事件的定义
20.搜索帮助事件的定义
②事件的实现
21.搜索帮助事件的实现
③事件的注册
22.搜索帮助事件的注册
④事件效果演示

因为CARRID字段被占用,所以本次使用旁边的字段进行校验。实际效果类似或相同。

23.搜索帮助事件的演示

8.Button Click

(1)触发条件

该事件是和Pushbutton一起使用的事件,当在OOALV中设置了Pushbutton,然后点击该按钮后即可触发

(2)事件参数
参数 参数类型 参数说明
ES_COL_ID LVC_S_COL 列的ID信息
ES_ROW_NO LVC_S_ROID 行的索引信息
(3)事件示例
①事件的定义
24.Button Click事件的定义
②事件的实现
25.Button Click事件的实现
③事件的注册
1
SET HANDLER GO_EVENTS->HANDLE_BUTTON_CLICK FOR GO_ALV.
④事件效果演示

图片中红色框圈出来的就是通过Layout设置的Pushbutton按钮。点击该按钮就会触发Button Click事件。

26.Button Click事件的演示

四、ALV Grid其他要素

1.红绿信号灯

(1)步骤

虽然OOALV提供了专门设置红绿信号灯的样式设置属性,但是在实际开发过程中也可以通过新增一个ICON ID属性的字段,然后直接设置红绿信号灯的图标样式来实现红绿信号灯的切换效果。

通过OOALV设置的红绿信号的等会出现在ALV的最左侧,这一列将不受字段目录的控制。意味着你无法设置其的然和属性(列名、位置等)。当你在OOALV最左侧需要设置一列CheckBox时或其他需要在最开头有限展示的内容时,通过OOALV自带的设置红绿信号灯的方式并不适合,因为他会显示在CheckBox的前面。

  • 因为红绿信号灯设置的是一行的红绿信号灯样式,所以需要在结构体中新增一个字段用于设置红绿信号灯的样式。
  • 在取数完成后设置红绿信号灯的字段值(1:红色;2:黄色;3:绿色)。
  • 将设置红绿信号灯样式的字段传入Layout的excp_fname字段中,代表该字段是控制红绿信号灯的样式字段。
(2)核心代码参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DATA:
BEGIN OF GS_TABLE,
....
LIGHT TYPE C, "设置红绿信号灯样式的字段
END OF GS_TABLE.
DATA:
GT_TABLE LIKE TABLE OF GS_TABLE.

LOOP AT GT_TABLE INTO GS_TABLE.
IF SY-TABIX < 10.
GS_TABLE-LIGHT = '1'.
ELSEIF SY-TABIX > 10 AND SY-TABIX < 20.
GS_TABLE-LIGHT = '2'.
ELSE.
GS_TABLE-LIGHT = '3'.
ENDIF.
MODIFY GT_TABLE FROM GS_TABLE TRANSPORTING LIGHT.
CLEAR: GS_TABLE.
ENDLOOP.

GS_LAYOUT-EXCP_FNAME = 'LIGHT'. "告诉Layout那个字段是设置红绿信号灯的样式字段
...

2.设置行颜色

(1)步骤

设置行颜色在OOALV中总共分为大致7种大类。此外还可以根据这七大类颜色去设置字体颜色。

和设置红绿信号灯的步骤基本一样,先在结构体中设置一个用于设置行颜色样式的字段,然后填入下面表格中的值用于设置行颜色/字体颜色。

颜色 颜色 字体颜色
C100 C110 C101
C200 C210 C201
C300 C310 C301
C400 C410 C401
C500 C510 C501
C600 C610 C601
C700 C710 C701
(2)核心代码参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DATA:
BEGIN OF GS_TABLE,
....
ROWCOLOR TYPE C LENGTH 4, "设置行颜色样式的字段
END OF GS_TABLE.
DATA:
GT_TABLE LIKE TABLE OF GS_TABLE.

LOOP AT GT_TABLE INTO GS_TABLE.
IF SY-TABIX < 10.
GS_TABLE-ROWCOLOR = 'C110'.
ELSEIF SY-TABIX > 10 AND SY-TABIX < 20.
GS_TABLE-ROWCOLOR = 'C210'.
ELSE.
GS_TABLE-ROWCOLOR = 'C310'.
ENDIF.
MODIFY GT_TABLE FROM GS_TABLE TRANSPORTING ROWCOLOR.
CLEAR: GS_TABLE.
ENDLOOP.

GS_LAYOUT-INFO_FNAME = 'ROWCOLOR'."告诉Layout那个字段是设置行颜色的样式字段
...
(3)效果演示

此处只是演示行颜色设置的效果,与上面的代码逻辑无关。上面的逻辑知识参考使用。

26.Button Click事件的演示

3.设置单元格颜色

(1)步骤

设置单元格颜色相较于设置列和行颜色会占用更多的资源,所以一般情况下非必要不建议使用。

和上面的步骤差不多,可以参考查看。

(2)核心代码参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DATA:
BEGIN OF GS_TABLE,
....
CELLCOLOR TYPE LVC_T_SCOL, "设置单元格颜色样式的内表字段
END OF GS_TABLE.
DATA:
LS_COLOR TYPE LVC_S_SCOL, "设置单元格颜色的结构体
GT_TABLE LIKE TABLE OF GS_TABLE.

LOOP AT GT_TABLE INTO GS_TABLE.
IF SY-TABIX < 10.
LS_COLOR-FNAME = 'FLDATE'. "设置单元格变色的字段名称
LS_COLOR-COLOR-COL = '1'. "所在的列索引
LS_COLOR-COLOR-INT = '1'. "设置单元格的颜色
APPEND LS_COLOR TO GS_TABLE-CELLCOLOR.
ELSEIF SY-TABIX > 10 AND SY-TABIX < 20.
LS_COLOR-FNAME = 'SEATSMAX'."设置单元格变色的字段名称
LS_COLOR-COLOR-COL = '7'. "所在的列索引
LS_COLOR-COLOR-INT = '1'. "设置单元格的颜色
APPEND LS_COLOR TO GS_TABLE-CELLCOLOR.
ENDIF.
MODIFY GT_TABLE FROM GS_TABLE TRANSPORTING CELLCOLOR.
CLEAR: GS_TABLE.
ENDLOOP.

GS_LAYOUT-CTAB_FNAME = 'CELLCOLOR'. "告诉Layout那个字段是设置单元格的样式字段
...
(3)效果演示
27.单元格颜色设置演示

4.设置Pushbutton

(1)步骤

在ALV中将满足条件的单元格设置成Pushbutton,当用户点击该按钮时可以跳转到其他页面或者显示更多的相关信息等,此时会触发ALV Grid的Button Click事件。

步骤基本类似,也是添加字段然后再在Layout中设置样式字段。

(2)核心代码参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DATA:
BEGIN OF GS_TABLE,
....
BUTTON LIKE ICON-ID, "被设置成PushButton样式的字段
STYLE TYPE LVC_T_STYL, "设置PushButton样式的内表字段
END OF GS_TABLE.
DATA:
LS_STYLE TYPE LVC_S_STYL, "设置PushButton样式的结构体
GT_TABLE LIKE TABLE OF GS_TABLE.

GS_TABLE-BUTTON = ICON_WS_PLANE. "设置按钮的图标
LS_STYLE-FIELDNAME = 'BUTTON'. "被设置成PushButton按钮样式的字段名
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON. "ALV Grid中的按钮样式
APPEND LS_STYLE TO GS_TABLE-STYLE.

"修改内表中所有数据的STYLE BUTTON字段值
MODIFY GT_TABLE FROM GS_TABLE TRANSPORTING STYLE BUTTON WHERE CARIID <> ''.

GS_LAYOUT-STYLEFNAME = 'STYLE'. "告诉Layout那个字段是设置PushButton的样式字段
...
(3)效果演示
26.Button Click事件的演示

评论