如何在cl_gui_alv_grid加载后按指定列实现排序功能
CL_GUI_ALV_GRID 按指定列排序崩溃/不生效问题解决方案
问题根因
你的代码存在3个核心问题:
- 首次调用
set_table_for_first_display时没有传入构造好的排序内表lt_sort,排序规则没有在ALV初始化阶段生效 set_sort_criteria的调用时机错误:如果在ALV完成初始化(即set_table_for_first_display执行完成)前调用该方法,会因为字段目录未加载触发异常,你注释了异常捕获逻辑,异常未被处理直接导致程序崩溃- 字段名匹配问题:
ls_sort-fieldname = 'Column1'的大小写需要和数据结构/字段目录中的字段名完全一致,ABAP中该参数大小写敏感,如果你定义的结构字段为大写的COLUMN1,填Column1会找不到对应字段触发dump
方案1:首次展示ALV时直接传入排序规则(最稳定,无额外调用)
修改first_display表单,给set_table_for_first_display方法增加it_sort参数传入即可,不需要额外调用set_sort_criteria,ALV加载完成后会自动按指定规则排序:
FORM first_display. PERFORM sort_data. CALL METHOD go_alv->set_table_for_first_display EXPORTING i_structure_name = 'TABLE_STRUCTURE' is_layout = gs_layout CHANGING it_outtab = gt_salv_table it_sort = lt_sort " 新增传入排序规则 ENDFORM.
方案2:ALV加载完成后动态修改排序
如果需要在ALV已经展示后动态调整排序,按以下逻辑调整代码:
- 确保
set_sort_criteria在set_table_for_first_display执行完成后调用 - 开启异常捕获避免未处理异常崩溃
- 调用后刷新ALV视图
* 确保go_alv已完成初始化后再执行以下代码 PERFORM sort_data. CALL METHOD go_alv->set_sort_criteria EXPORTING it_sort = lt_sort EXCEPTIONS no_fieldcatalog_available = 1 others = 2. IF sy-subrc = 0. " 排序设置成功后刷新ALV视图 CALL METHOD go_alv->refresh_table_display EXPORTING i_soft_refresh = abap_true. ENDIF.
额外校验点
排序规则的字段名建议统一写全大写,和ABAP字典字段默认格式保持一致,同时补充明确的属性赋值,避免默认值异常:
ls_sort-spos = 1. ls_sort-fieldname = 'COLUMN1'. ls_sort-up = abap_true. ls_sort-down = abap_false. ls_sort-subtot = abap_false. " 不需要小计的话明确赋值为假
内容的提问来源于stack exchange,提问作者smoothlikebutter
相关产品推荐
相关产品推荐

