本篇可以说是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 | DATA: |
2.获取ALV Grid布局信息
(1)方法名
GET_FRONTEND_LAYOUT
(2)介绍
返回当前ALV Grid上设置的布局信息。
(3)参数
参数 | 参数类型 | 参数说明 |
---|---|---|
ES_LAYOUT | LVC_S_LAYO | 当前ALV Grid上设置的布局信息 |
(4)用例
1 | DATA: |
3.返回所选多个单元格的信息
(1)方法名
GET_SELECTED_CELLS
(2)介绍
返回所选多个单元格信息。
和其他编程语言一样,既然有Get方法也就基本会有Set方法,而Set方法的效果不仅仅体现在代码层面,也可以反应在画面上。在画面上的效果其实也就和你选择一个单元格或多个单元格的效果一致。不过不一样的地方就是如果你希望在画面上显示出选择单元格的黄色选中效果则在执行完Set方法之后不可以调用ALV刷新方法。一旦调用刷新方法选中的画面效果就不显示了。
(3)参数
参数 | 参数类型 | 参数说明 |
---|---|---|
ET_CELL | LVC_T_CELL | 存放有选择的单元格的字段名(Col_id)、行索引值(Row_id)和单元格值(Value) |
(4)用例
1 | DATA: |
4.返回所选列的信息
(1)方法名
GET_SELECTED_COLUMNS
(2)介绍
返回所选列的信息。
和其他编程语言一样,既然有Get方法也就基本会有Set方法,而Set方法的效果不仅仅体现在代码层面,也可以反应在画面上。在画面上的效果其实也就和你选择一列或多列的效果一致。不过不一样的地方就是如果你希望在画面上显示出选择列的黄色选中效果则在执行完Set方法之后不可以调用ALV刷新方法。一旦调用刷新方法选中的画面效果就不显示了。
(3)参数
参数 | 参数类型 | 参数说明 |
---|---|---|
ET_INDEX_COLUMNS | LVC_T_COL | 返回列名(Fieldname)和层级结构类型(Hierlevel) |
(4)用例
1 | DATA: |
5.返回所选行的信息
(1)方法名
GET_SELECTED_ROWS
(2)介绍
返回在OOALV界面左侧点击一个或多个行选择按钮的行信息
和其他编程语言一样,既然有Get方法也就基本会有Set方法,而Set方法的效果不仅仅体现在代码层面,也可以反应在画面上。在画面上的效果其实也就和你选择一行或多行的效果一致。不过不一样的地方就是如果你希望在画面上显示出选择行的黄色选中效果则在执行完Set方法之后不可以调用ALV刷新方法。一旦调用刷新方法选中的画面效果就不显示了。
(3)参数
参数 | 参数类型 | 参数说明 |
---|---|---|
ET_INDEX_ROWS | LVC_T_ROW | 返回行类型(Rowtype)和行的索引(Index) |
(4)用例
1 | DATA: |
6.刷新方法
(1)方法名
REFRESH_TABLE_DISPLAY
(2)介绍
当内表在执行完事件或对页面有更改的操作后,调用该方法将内表的内容重新加载到页面上,但并不是只要执行完事件就需要调用该方法,具体的情况需要具体分析。
(3)参数
参数 | 参数类型 | 参数说明 |
---|---|---|
IS_STABLE | LVC_S_STB1 | 用于设置刷新时行和列保持不变的参数 |
I_SOFT_REFESH | CHAR01 | 设置排序、筛选和求和等布局不变的参数 |
(4)用例
1 | DATA: |
三、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 | SET HANDLER GO_EVENTS->HANDLE_DOUBLE_CLICK FOR GO_ALV. |
④事件效果演示
双击其中一行或单元格会显示你当前单击的行号。
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)事件示例
①事件的定义
②事件的实现
③事件的注册
1 | SET HANDLER GO_EVENTS->HANDLE_HOTSPOT_CLICK FOR GO_ALV. |
④事件效果演示
3.添加按钮事件(Toolbar)
(1)触发条件
该事件没有触发条件,或者说触发条件是在注册然后调用ALV的时候。因为该事件的作用是在ALV上添加自定义按钮。只是添加按钮而不实现按钮的逻辑。设置按钮的逻辑是通过USER COMMAND事件进行设置的。
(2)事件参数
参数 | 参数类型 | 参数说明 |
---|---|---|
E_OBJECT | CL_ALV_EVENT_TOOLBAR_SET | ALV TOOLBAR对象 |
E_INTERACTIVE | CHAR01 | 交互式调用与否 |
(3)事件示例
①事件的定义
②事件的实现
③事件的注册
1 | SET HANDLER GO_EVENTS->HANDLE_TOOLBAER FOR GO_ALV. |
④事件效果演示
4.按钮响应事件(User Command)
(1)触发条件
当点击Toolbar事件添加的自定义按钮时触发。相关的事件还有AFTER_USER_COMMAND和BEFORE_USER_COMMAND。该事件只有一个参数E_UCOMM。该参数存放的是在添加自定按钮时的Function Code。
(2)事件参数
参数 | 参数类型 | 参数说明 |
---|---|---|
E_UCOMM | E_UCOMM | 接收Toolbar按钮返回的Function Code |
(3)事件示例
①事件的定义
②事件的实现
③事件的注册
1 | SET HANDLER GO_EVENTS->HANDLE_USER_COMMAND FOR GO_ALV. |
④事件效果演示
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)事件示例
①事件的定义
②事件的实现
③事件的注册
6.TOP OF PAGE事件
(1)触发条件
和Toolbar事件一样,没有触发条件,或者说触发条件是调用ALV组件的时候。
(2)事件参数
参数 | 参数类型 | 参数说明 |
---|---|---|
E_DYNDOC_ID | CL_DD_DOCUMENT | 动态文件 |
TABLE_INDEX | SYINDEX | Loops,Current Loop Pass |
(3)事件示例
①事件的定义
②事件的实现
③事件的注册
④事件效果演示
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)事件示例
①事件的定义
②事件的实现
③事件的注册
④事件效果演示
因为CARRID字段被占用,所以本次使用旁边的字段进行校验。实际效果类似或相同。
8.Button Click
(1)触发条件
该事件是和Pushbutton一起使用的事件,当在OOALV中设置了Pushbutton,然后点击该按钮后即可触发
(2)事件参数
参数 | 参数类型 | 参数说明 |
---|---|---|
ES_COL_ID | LVC_S_COL | 列的ID信息 |
ES_ROW_NO | LVC_S_ROID | 行的索引信息 |
(3)事件示例
①事件的定义
②事件的实现
③事件的注册
1 | SET HANDLER GO_EVENTS->HANDLE_BUTTON_CLICK FOR GO_ALV. |
④事件效果演示
图片中红色框圈出来的就是通过Layout设置的Pushbutton按钮。点击该按钮就会触发Button Click事件。
四、ALV Grid其他要素
1.红绿信号灯
(1)步骤
虽然OOALV提供了专门设置红绿信号灯的样式设置属性,但是在实际开发过程中也可以通过新增一个ICON ID属性的字段,然后直接设置红绿信号灯的图标样式来实现红绿信号灯的切换效果。
通过OOALV设置的红绿信号的等会出现在ALV的最左侧,这一列将不受字段目录的控制。意味着你无法设置其的然和属性(列名、位置等)。当你在OOALV最左侧需要设置一列CheckBox时或其他需要在最开头有限展示的内容时,通过OOALV自带的设置红绿信号灯的方式并不适合,因为他会显示在CheckBox的前面。
- 因为红绿信号灯设置的是一行的红绿信号灯样式,所以需要在结构体中新增一个字段用于设置红绿信号灯的样式。
- 在取数完成后设置红绿信号灯的字段值(1:红色;2:黄色;3:绿色)。
- 将设置红绿信号灯样式的字段传入Layout的excp_fname字段中,代表该字段是控制红绿信号灯的样式字段。
(2)核心代码参考
1 | DATA: |
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 | DATA: |
(3)效果演示
此处只是演示行颜色设置的效果,与上面的代码逻辑无关。上面的逻辑知识参考使用。
3.设置单元格颜色
(1)步骤
设置单元格颜色相较于设置列和行颜色会占用更多的资源,所以一般情况下非必要不建议使用。
和上面的步骤差不多,可以参考查看。
(2)核心代码参考
1 | DATA: |
(3)效果演示
4.设置Pushbutton
(1)步骤
在ALV中将满足条件的单元格设置成Pushbutton,当用户点击该按钮时可以跳转到其他页面或者显示更多的相关信息等,此时会触发ALV Grid的Button Click事件。
步骤基本类似,也是添加字段然后再在Layout中设置样式字段。
(2)核心代码参考
1 | DATA: |