You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CL_GUI_ALV_GRID默认容器实现超长换行表头的方法

问题:CL_GUI_ALV_GRID默认容器下设置超长换行表头

在使用默认容器的CL_GUI_ALV_GRID时,通过布局结构LVC_S_LAYO的GRID_TITLE参数最多只能设置70个字符,现在需要支持更长的字符数且允许换行。当前报表先显示选择屏幕,最终展示带数据的ALV-Grid,但表头长度受限。


解决方案:自定义容器替代默认容器

默认容器的ALV表头是控件自带的,硬限制70字符。改用自定义容器后,可在容器上方添加独立文本控件实现超长换行表头,这是最稳定可靠的方案。

实现步骤

  1. 创建自定义屏幕(示例中为屏幕2000),添加自定义容器(命名为CC_ALV)
  2. 在代码中实例化文本控件(推荐用CL_GUI_TEXT_EDIT,对超长文本和换行支持更好),设置不可编辑、自动换行属性
  3. 将文本控件和ALV控件依次添加到自定义容器的布局管理器中,分配各自高度
  4. 实例化ALV时指定自定义容器为父容器,不再使用LVC_S_LAYO的GRID_TITLE参数

修改后的完整代码示例

REPORT ZTEST.

*...Tabellen Implementierung
TABLES: p0001, sscrfields.

INCLUDE <icon>.

DATA: go_alv_grid     TYPE REF TO cl_gui_alv_grid,
      go_container    TYPE REF TO cl_gui_custom_container,
      go_text_head    TYPE REF TO cl_gui_text_edit.

DATA: gt_celltab      TYPE lvc_t_styl,
      gt_fieldcatalog TYPE lvc_t_fcat.

DATA: BEGIN OF gt_data OCCURS 0.
        INCLUDE STRUCTURE z96_py_iks_1_2.
        DATA: celltab TYPE lvc_t_styl.
DATA: changed TYPE os_boolean,
      enabled TYPE os_boolean,
      test    TYPE string.
DATA: END OF gt_data.

DATA: gv_screen_status TYPE string VALUE 'INIT'.

SELECTION-SCREEN BEGIN OF BLOCK selection WITH FRAME TITLE TEXT-s01.
PARAMETERS: p_month TYPE ziks_month DEFAULT sy-datum+4(2),
            p_year  TYPE ziks_year DEFAULT sy-datum+0(4).
SELECT-OPTIONS: so_bukrs FOR p0001-bukrs,
                so_persk FOR p0001-persk,
                so_sacha FOR p0001-sacha.
SELECTION-SCREEN END OF BLOCK selection.

* 自定义屏幕:添加自定义容器CC_ALV
SELECTION-SCREEN BEGIN OF SCREEN 2000.
  CONTROL CC_ALV TYPE CNTL_AREA.
SELECTION-SCREEN END OF SCREEN 2000.

INITIALIZATION.

AT SELECTION-SCREEN.

AT SELECTION-SCREEN OUTPUT.

  IF gv_screen_status = 'IN_SELECTION'.
* 数据读取
    SELECT * FROM z96_py_iks_1_2 INTO CORRESPONDING FIELDS OF TABLE gt_data 
      WHERE audit_month = p_month
        AND audit_year  = p_year
        AND bukrs IN so_bukrs
        AND persk IN so_persk
        AND sacha IN so_sacha.

* 创建自定义容器
    CREATE OBJECT go_container
      EXPORTING
        container_name = 'CC_ALV'.

* 创建并配置表头文本控件
    CREATE OBJECT go_text_head
      EXPORTING
        parent = go_container.

* 设置超长换行表头内容
    DATA(lv_long_title) = '这是一个支持多行显示的超长ALV表头,可包含超过70个字符的详细信息,比如报表用途、当前筛选条件、统计说明等,完全不受原参数的字符限制,会根据设置的宽度自动换行'.
    CALL METHOD go_text_head->set_text_as_r3table
      EXPORTING
        table = VALUE #( ( lv_long_title ) ).

* 设置文本不可编辑、自动换行
    CALL METHOD go_text_head->set_readonly_mode
      EXPORTING
        readonly_mode = abap_true.
    CALL METHOD go_text_head->set_wordwrap_mode
      EXPORTING
        wordwrap_mode = cl_gui_text_edit=>wordwrap_at_fixed_position
        fixed_position = 80. " 自定义换行宽度

* 布局管理器:分配表头和ALV的高度占比
    DATA(lo_layout) = go_container->get_layout_manager( ).
    CALL METHOD lo_layout->add_control
      EXPORTING
        control = go_text_head
        width   = 100
        height  = 3. " 表头高度(按百分比分配)

* 实例化ALV到自定义容器
    CREATE OBJECT go_alv_grid
      EXPORTING
        i_parent      = go_container
        i_appl_events = abap_true.

* ALV布局设置(不再使用GRID_TITLE)
    DATA(ls_layout) = VALUE lvc_s_layo( stylefname = 'CELLTAB'
*                                        zebra      = abap_true
*                                        cwidth_opt = 'X' ).

* 通过SALV生成字段目录
    DATA: lo_salv TYPE REF TO cl_salv_table.
    cl_salv_table=>factory( IMPORTING
                              r_salv_table = lo_salv
                            CHANGING
                              t_table      = gt_data[] ).
    gt_fieldcatalog = cl_salv_controller_metadata=>get_lvc_fieldcatalog( 
                         r_columns      = lo_salv->get_columns( )
                         r_aggregations = lo_salv->get_aggregations( ) ).

* 显示ALV
    go_alv_grid->set_table_for_first_display( EXPORTING
                                          i_bypassing_buffer = abap_false
                                          i_save             = 'A'
                                          is_layout          = ls_layout
                                        CHANGING
                                          it_fieldcatalog    = gt_fieldcatalog
                                          it_outtab          = gt_data[] ).

* 分配ALV控件高度
    CALL METHOD lo_layout->add_control
      EXPORTING
        control = go_alv_grid
        width   = 100
        height  = 97.

* 移除不需要的工具栏按钮
    DATA: it_exclude_btn TYPE STANDARD TABLE OF rsexfcode WITH DEFAULT KEY.
    it_exclude_btn = VALUE #( ( fcode = 'ONLI' )
                              ( fcode = 'DYNS' )
                              ( fcode = 'SPOS' ) ).
    CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
      EXPORTING
        p_status  = '%_00'
      TABLES
        p_exclude = it_exclude_btn.

* 隐藏默认工具栏
    cl_abap_list_layout=>suppress_toolbar( ).

* 设置ALV焦点
    cl_gui_alv_grid=>set_focus( control = go_alv_grid ).

* 更新屏幕状态标记
    gv_screen_status = 'IN_ALV'.

  ENDIF.

START-OF-SELECTION.

  gv_screen_status = 'IN_SELECTION'.
  CALL SELECTION-SCREEN 2000.

注意事项

  • 可根据实际需求调整文本控件的fixed_position参数,控制换行宽度
  • 如果仅需简单文本显示,也可替换为CL_GUI_LABEL控件,但CL_GUI_TEXT_EDIT对超长文本适配更优
  • 自定义容器的高度分配可根据表头内容长度调整height参数(百分比值)

内容的提问来源于stack exchange,提问作者Andre Matjasic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 12:44:51