SAP ABAP CL_SALV_TABLE的列优化功能不起作用

编程语言 2026-07-11

我在自定义容器中使用 CL_SALV_TABLE 显示一个ALV,但即使调用了 lo_columns->set_optimize( abap_true ),表头列的宽度都相同,且不会根据内容自动调整。

如何让在容器中显示时,CL_SALV_TABLE 的列能够自动根据内容调整宽度?使用 set_optimize 与容器一起时是否有需要特别注意的事项,还是有其他强制自动调整大小的方法?谢谢!

以下是我的代码的简化版本:

DATA: lo_alv      TYPE REF TO cl_salv_table,
      lo_columns  TYPE REF TO cl_salv_columns_table.

TRY.
    cl_salv_table=>factory(
      EXPORTING
        r_container  = io_container
      IMPORTING
        r_salv_table = lo_alv
      CHANGING
        t_table      = ct_final ).
  CATCH cx_salv_msg INTO DATA(lx_msg).
    MESSAGE lx_msg->get_text( ) TYPE 'E'.
ENDTRY.

lo_columns = lo_alv->get_columns( ).
lo_columns->set_optimize( abap_true ). "Optimize

"Set texts
TRY.
    lo_column = lo_columns->get_column( 'BANFN' ).
        lo_column->set_short_text( CONV #( TEXT-002 ) ).
        lo_column->set_medium_text( CONV #( TEXT-002 ) ).
        lo_column->set_long_text( CONV #( TEXT-002 ) ).
  CATCH cx_salv_not_found.
ENDTRY.

"Hide technical fields
TRY.
    lo_column = lo_columns->get_column( 'STATU' ).
        lo_column->set_technical( abap_true ).
    CATCH cx_salv_not_found.
ENDTRY.

lo_alv->display( ).

解决方案

下面是一个最小可复现的示例,用来演示列优化:

REPORT z_alv_optimize_columns.
PARAMETERS dummy.
AT SELECTION-SCREEN OUTPUT.
  DATA go_salv TYPE REF TO cl_salv_table.

  IF go_salv IS NOT BOUND.
    SELECT *
      FROM sflight
      INTO TABLE @DATA(gt_sflight).
    cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>screen0
                            IMPORTING r_salv_table = go_salv
                            CHANGING  t_table      = gt_sflight ).
    go_salv->get_columns( )->set_optimize( abap_true ).
    go_salv->display( ).
  ENDIF.

带列优化的结果:

带列优化的 ALV

如果你的程序仍然存在问题,请把问题做成可复现的版本(我可以在我的系统上不费力地重现它)或让我修改我的程序以复现你的问题并进行沟通。

供参考,这是没有列优化的结果:

未进行列优化的 ALV

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章