屏幕0100容器中CL_SALV_TABLE创建的ALV无法获取选中行问题
解决CL_SALV_TABLE ALV点击外部按钮无法获取选中行的问题
这个问题我做ALV开发时也踩过同款坑,核心原因是屏幕按钮触发PAI时,ALV前端控件的选中状态不会自动同步到后端的CL_SALV_SELECTIONS对象中——只有ALV自身工具栏的按钮(也就是你说的标识1)触发内部事件时,SAP底层会自动完成前端选中状态到后端对象的同步,而外部屏幕按钮的PAI流程没有这个默认逻辑,导致你拿到的是旧的甚至清空的选中状态。
下面是具体的解决步骤:
1. 在屏幕按钮的PAI代码中手动同步选中状态
在处理外部按钮的PAI逻辑里,先调用ALV的refresh()方法,强制把前端最新的选中状态同步到后端对象,之后再获取选中行:
" 先同步ALV前端与后端的状态 go_alv_dms->refresh( ). " 再获取选中行 DATA(lt_selected_rows) = go_alv_dms->get_selections( )->get_selected_rows( ).
这样就能拿到点击按钮时ALV上实际选中的行数据了。
2. 检查选中模式的注册是否正确
你提到已经注册了选中,务必确认注册代码是正确的,确保开启了可选模式且不是只读状态:
DATA(lo_selections) = go_alv_dms->get_selections( ). " 设置多选/单选模式,根据你的需求选择 lo_selections->set_selection_mode( if_salv_c_selection_mode=>multiple ). " 确保选中功能不是只读的 lo_selections->set_read_only( abap_false ).
如果不小心设置了set_read_only( abap_true ),即使前端能选中,后端也无法获取到选中行。
3. 排查PAI中是否意外重置了ALV对象
检查屏幕的PAI逻辑里,有没有重新初始化全局ALV对象go_alv_dms的代码。比如如果在PAI里又重新执行了CL_SALV_TABLE=>factory()创建实例,会直接覆盖之前的对象,导致选中状态完全丢失。
补充说明:为什么ALV自身工具栏按钮可以正常获取
ALV自带的工具栏按钮(标识1)触发的是ALV内部的事件处理流程,SAP已经在底层实现了前端选中状态到后端对象的同步,所以你调用get_selected_rows()时拿到的是最新数据。而外部屏幕按钮属于屏幕的独立事件,没有这个默认同步机制,必须手动触发。
内容的提问来源于stack exchange,提问作者Nikito_Os
相关产品推荐
相关产品推荐

