SALV网格初始化触发事件查询及首次加载状态栏消息实现问询
SALV Grid首次渲染完成触发状态栏消息的解决方案
标准CL_SALV_TABLE类未公开「首次渲染完成」「初始化完成」类的公开事件,你之前的尝试不符合预期的原因如下:
- TOP_OF_PAGE/END_OF_PAGE事件仅在列表分页渲染(翻页、打印预览)时触发,首次加载单页数据时默认不会执行
display()方法为阻塞调用,只有用户关闭SALV屏幕后才会返回,因此写在该方法后的消息只会在退出时触发
可行实现方案
推荐使用预调度功能码方案,不需要额外自定义屏幕、逻辑简单稳定,实现步骤如下:
步骤1:修改自定义PF状态
在你创建的SALV_STATUS状态中添加一个自定义功能码Z_INIT_MSG,不需要分配按钮,仅在功能码列表中保留即可。
步骤2:绑定SALV标准功能事件
获取SALV事件对象,绑定FUNCTION事件(触发任意功能码时都会调用):
DATA(lo_events) = lo_alv->get_event( ). SET HANDLER cl_event_handler=>on_function_trigger FOR lo_events.
步骤3:实现事件处理逻辑
在事件处理类中实现对应方法,用静态变量控制消息仅首次触发一次:
METHOD on_function_trigger. " 静态变量控制仅触发一次 STATICS: sv_first_run TYPE abap_bool VALUE abap_true. IF sv_first_run = abap_true AND e_salv_function = 'Z_INIT_MSG'. " 替换为你需要显示的消息,S类型会直接展示在底部状态栏 MESSAGE s001(zmsg_class) WITH '数据加载完成,共' && lines( itab ) && '条记录'. sv_first_run = abap_false. " 清空功能码,避免标准逻辑报错 CLEAR e_salv_function. ENDIF. ENDMETHOD.
步骤4:预调度功能码
在调用display()方法前,调用函数将自定义功能码压入GUI队列,SALV首次渲染完成后会自动触发该功能码:
CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE' EXPORTING functioncode = 'Z_INIT_MSG' EXCEPTIONS OTHERS = 1. lo_alv->display( ).
其他可选方案
如果不想修改PF状态,也可以通过隐式增强CL_SALV_TABLE类的DISPLAY方法末尾实现,或者绑定AFTER_REFRESH事件后手动触发一次lo_alv->refresh( ),但稳定性和兼容性弱于上述方案。
内容的提问来源于stack exchange,提问作者Suncatcher
相关产品推荐
相关产品推荐

