目录
前言
在ABAP编程中,IT_EVENT_EXIT与ALV控件的事件处理有关,特别是涉及到自定义或高级交互场景。IT_EVENT_EXIT通常是一个内表(SLIS_T_EVENT_EXIT类型),用于存储和处理与ALV操作相关的特定事件信息,尤其是那些在用户执行操作后、ALV事件循环退出前需要处理的事件。该事件是处理用户退出ALV界面时相关逻辑的重要机制,开发者应该根据具体业务需求来编写适当的事件处理程序。
实战
点击ALV标准的工具栏按钮时,不会回调相关的I_CALLBACK_USER_COMMAND = 'USER_COMMAND'参数中指定的Form ,因为那些按钮所对应的功能代码已被设为保留Funcode了,如果要想在点击这些标准的按钮时也回调指定的Form,可通过IT_EVENT_EXIT 参数实现。向IT_EVENT_EXIT参数内表填充需要被拦截的保留Funcode,是在执行对应功能代码之前还是之后调用。
示例代码:
DATA: gt_event_exit TYPE slis_t_event_exit WITH HEADER LINE.
* 实现当点击全选按钮后触发user_command
gt_event_exit-ucomm = '&ALL'."全选按钮
gt_event_exit-after = 'X'."在执行完预置功能之后调用
"gt_event_exit-before = 'X'."在执行完预置功能之前调用
APPEND gt_event_exit.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_user_command = 'F_USER_COMMAND'
it_event_exit = gt_event_exit[]
…
FORM f_user_command USING p_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN '&IC1'. "双击
ENDCASE.
ENDFORM.
案例
此代码片段展示了如何通过事件出口机制在ALV中实现自定义的交互逻辑,特别是围绕布局调整的事件处理。通过预先定义的事件出口(如改变布局的按钮),可以插入自定义逻辑,增强ALV的功能性和用户体验。需要注意的是,示例中的消息输出是一种简化的处理方式,实际应用中应根据具体需求设计事件处理逻辑。
展示效果:
完整代码:
TYPE-POOLS:slis.
DATA:gt_fieldcat TYPE slis_t_fieldcat_alv,
gs_fieldcat TYPE slis_fieldcat_alv,
gs_layout TYPE slis_layout_alv,
gv_repid TYPE sy-repid.
DATA: gt_event_exit TYPE slis_t_event_exit WITH HEADER LINE.
DATA:gt_spfli LIKE STANDARD TABLE OF spfli WITH HEADER LINE.
INITIALIZATION.
gv_repid = sy-repid.
*屏幕开始事件
START-OF-SELECTION.
PERFORM f_getdata.
PERFORM f_catalog.
PERFORM f_alvshow.
FORM f_getdata.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_spfli.
ENDFORM.
FORM f_catalog.
*fieldcat属性
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = gv_repid
i_structure_name = 'SPFLI'
CHANGING
ct_fieldcat = gt_fieldcat "导出gt_fieldcat内表数据
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR gs_fieldcat.
*"对gt_fieldcat属性的修改
READ TABLE gt_fieldcat INTO gs_fieldcat INDEX 2. "将第二列设为热点显示
gs_fieldcat-hotspot = 'X'.
MODIFY gt_fieldcat FROM gs_fieldcat INDEX 2.
*layout属性
gs_layout-zebra = 'X'."斑马线显示
gs_layout-colwidth_optimize = 'X'."列宽度最优化显示
ENDFORM.
FORM f_alvshow.
gt_event_exit-ucomm = '&OL0'."布局按钮
"gt_event_exit-after = 'X'. "在执行完预置功能之后调用
gt_event_exit-before = 'X'."在执行完预置功能之前调用
APPEND gt_event_exit.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = gv_repid
i_grid_title = 'ALV REPORT TEST' "ALV显示标题
is_layout = gs_layout
it_fieldcat = gt_fieldcat
i_callback_user_command = 'F_USER_COMMAND'
it_event_exit = gt_event_exit[]
TABLES
t_outtab = gt_spfli
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
FORM f_user_command USING p_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
MESSAGE i001(00) WITH '事件触发时当前行:' rs_selfield-tabindex.
ENDFORM.