ABAPSALV 选择模式触发事件

作者:ABAP猿 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

# ABAP SALV-选择模式、触发事件

原创 猿ABAP [ ABAP猿 ](javascript:void\(0\);)

__ _ _ _ _

ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

点击上方 蓝字 关注我们

ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

Everything that has a beginning has an end.

世间万物有始皆有终。

功能说明

上篇: [ ABAP SALV-页眉、页脚

](http://mp.weixin.qq.com/s?__biz=Mzg3OTE2Njg0OQ==&mid=2247493492&idx=1&sn=a8a0126ed2adb0f66d073ab2a0d94c31&chksm=cf0a339af87dba8c58811e22511a19917fe000986b772b5e87c1f23040c36ba9e7bb89024bd1&scene=21#wechat_redirect)

本系列将通过模拟用户与开发者之间的对话场景, 来逐步演示SALV的使用。在本篇中,我们将延续前文内容,解决用户最新提出的需求,并同时介绍 SALV部分

事件 的 触发时机 ,为后续新增功能的实现提供必要的知识储备 **。** 让我们一起来探索吧。

赶紧动手试一试 ,以便更好地掌握这些新的知识点。

功能效果

ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

第 12 天 用户说

现在每次只能复制单行数据,我想选择多行进行复制。

IF p_day12 EQ 'X' .

DATA lo_selections TYPE REF TO cl_salv_selections .

lo_selections = go_salv -> get_selections ( ). lo_selections -> set_selection_mode ( if_salv_c_selection_mode => cell ).

...

ENDIF .
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

第 13 天 用户说

用户今天啥也没说,你来研究下SALV的触发事件吧!

IF p_day13 EQ 'X' .

DATA lo_events_table TYPE REF TO cl_salv_events_table .

lo_events_table = go_salv -> get_event ( ).

DATA lo_evt_handler TYPE REF TO lcl_evt_handler .

CREATE OBJECT lo_evt_handler .

SET HANDLER lo_evt_handler -> on_link_click FOR lo_events_table .

SET HANDLER lo_evt_handler -> on_double_click FOR lo_events_table .

SET HANDLER lo_evt_handler -> on_added_function FOR lo_events_table .

SET HANDLER lo_evt_handler -> before_salv_function FOR lo_events_table .

SET HANDLER lo_evt_handler -> after_salv_function FOR lo_events_table .

...

ENDIF .
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

源码分享

CLASS lcl_evt_handler DEFINITION .

PUBLIC SECTION .

METHODS on_link_click "单击(热点)

FOR EVENT link_click OF cl_salv_events_table

IMPORTING row column .

METHODS on_double_click "双击

FOR EVENT double_click OF cl_salv_events_table

IMPORTING row column .

METHODS on_added_function "新增按钮点击

FOR EVENT added_function OF cl_salv_events_table

IMPORTING e_salv_function .

METHODS before_salv_function "标准按钮点击前

FOR EVENT before_salv_function OF cl_salv_events_table

IMPORTING e_salv_function .

METHODS after_salv_function "标准按钮点击后

FOR EVENT after_salv_function OF cl_salv_events_table

IMPORTING e_salv_function .

ENDCLASS .
CLASS lcl_evt_handler IMPLEMENTATION . METHOD on_link_click .

MESSAGE i001 ( 00 ) WITH 'on_link_click:' row ' - ' column .

ENDMETHOD . METHOD on_double_click .

MESSAGE i001 ( 00 ) WITH 'on_double_click:' row ' - ' column .

ENDMETHOD . METHOD on_added_function .

MESSAGE i001 ( 00 ) WITH 'on_added_function:' e_salv_function .

ENDMETHOD . METHOD before_salv_function .

MESSAGE i001 ( 00 ) WITH 'before_salv_function:' e_salv_function .

ENDMETHOD . METHOD after_salv_function .

MESSAGE i001 ( 00 ) WITH 'after_salv_function:' e_salv_function .

ENDMETHOD . ENDCLASS .
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t1 . SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1 ( 79 ) day01 . SELECTION-SCREEN END OF LINE . SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1 ( 79 ) day02 . SELECTION-SCREEN END OF LINE . SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1 ( 79 ) day03 . SELECTION-SCREEN END OF LINE . SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1 ( 79 ) day04 . SELECTION-SCREEN END OF LINE .

...

SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1 ( 79 ) day12 . SELECTION-SCREEN END OF LINE . SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1 ( 79 ) day13 . SELECTION-SCREEN END OF LINE . SELECTION-SCREEN END OF BLOCK b1 .
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t2 .

PARAMETERS p_day01 AS CHECKBOX DEFAULT 'X' . "01、基本展示

PARAMETERS p_day02 AS CHECKBOX DEFAULT 'X' . "02、外观设置

PARAMETERS p_day03 AS CHECKBOX DEFAULT 'X' . "03、列设置

PARAMETERS p_day04 AS CHECKBOX DEFAULT 'X' . "04、按钮设置

...

PARAMETERS p_day12 AS CHECKBOX DEFAULT 'X' . "12、选择模式

PARAMETERS p_day13 AS CHECKBOX DEFAULT 'X' . "13、触发事件

SELECTION-SCREEN END OF BLOCK b2 .

INITIALIZATION .

sy \- title = 'ABAP SALV演示程序-公众号(ABAP猿)' .

t1 = '用户说' .

t2 = '你来做' .

day01 = '01、从表SPFLI获取数据,并进行基本展示。' .

day02 = '02、能否修改下抬头标题文本,并斑马纹展示?' .

day03 = '03、能否优化下列宽?' .

day04 = '04、怎么没有应用工具栏按钮,能加上吗?' .

...

day12 = '12、现在每次只能复制单行数据,我想选择多行进行复制。' .

day13 = '13、用户今天啥也没说,你来研究下SALV的触发事件吧!' .

%_p_day01_%_app_% \- text = '01、基本展示' .

%_p_day02_%_app_% \- text = '02、外观设置' .

%_p_day03_%_app_% \- text = '03、列设置' .

%_p_day04_%_app_% \- text = '04、按钮设置' .

...

%_p_day12_%_app_% \- text = '12、选择模式' .

%_p_day13_%_app_% \- text = '13、触发事件' .

START-OF-SELECTION .

*------------------------------------*

CHECK p_day01 EQ 'X' .

DATA gt_spfli TYPE TABLE OF spfli .

SELECT * FROM spfli INTO TABLE gt_spfli UP TO 30 ROWS .

DATA go_salv TYPE REF TO cl_salv_table .

cl_salv_table => factory (

IMPORTING

r_salv_table = go_salv

CHANGING

t_table = gt_spfli ).

...

*------------------------------------*

IF p_day02 EQ 'X' .

DATA lo_display TYPE REF TO cl_salv_display_settings .

lo_display = go_salv -> get_display_settings ( ).

lo_display -> set_list_header ( 'ABAP SALV演示程序-公众号(ABAP猿)' ).

lo_display -> set_striped_pattern ( 'X' ).

...

ENDIF .

*------------------------------------*

IF p_day03 EQ 'X' .

DATA lo_columns TYPE REF TO cl_salv_columns_table .

lo_columns = go_salv -> get_columns ( ).

lo_columns -> set_optimize ( 'X' ).

...

IF p_day13 = 'X' .

DATA lo_column TYPE REF TO cl_salv_column_table .

lo_column ?= lo_columns -> get_column ( columnname = 'CARRID' ). lo_column -> set_cell_type ( if_salv_c_cell_type => hotspot ). ENDIF . ENDIF .

*------------------------------------*

IF p_day04 EQ 'X' .

DATA lo_functions TYPE REF TO cl_salv_functions .

lo_functions = go_salv -> get_functions ( ).

lo_functions -> set_all ( 'X' ).

...

ENDIF .

*------------------------------------*

...

*------------------------------------*

IF p_day12 EQ 'X' .

DATA lo_selections TYPE REF TO cl_salv_selections .

lo_selections = go_salv -> get_selections ( ). lo_selections -> set_selection_mode ( if_salv_c_selection_mode => cell ).

...

ENDIF .

*------------------------------------*

IF p_day13 EQ 'X' .

DATA lo_events_table TYPE REF TO cl_salv_events_table .

lo_events_table = go_salv -> get_event ( ).

DATA lo_evt_handler TYPE REF TO lcl_evt_handler .

CREATE OBJECT lo_evt_handler .

SET HANDLER lo_evt_handler -> on_link_click FOR lo_events_table .

SET HANDLER lo_evt_handler -> on_double_click FOR lo_events_table .

SET HANDLER lo_evt_handler -> on_added_function FOR lo_events_table .

SET HANDLER lo_evt_handler -> before_salv_function FOR lo_events_table .

SET HANDLER lo_evt_handler -> after_salv_function FOR lo_events_table .

...

ENDIF .

*------------------------------------*

go_salv -> display ( ).

• * *

**小贴士:**

• **** 可使用BC_DATA_GEN生成数据,以便查看演示效果;

• 以上纯属个人总结,如有纰漏请联系我,谢谢;

以上是今日分享,希望对你有所帮助~~~

欢迎点赞、留言、分享

ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图
ABAPSALV 选择模式触发事 - 封面图

ABAPSALV 选择模式触发事 - 封面图.textContent = new Date().getFullYear();