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

拆分器容器中ALV网格的变式管理功能异常问题

ALV网格嵌入拆分器容器时变式管理界面为空的问题

问题现象

将ALV网格嵌入拆分器容器(splitter container)后,选择布局、修改布局、保存布局功能正常,但**“管理变式”界面为空**,无法看到已保存的布局变式。问题根源推测为ALV的父容器并非cl_gui_container=>default_screen,而是拆分器容器导致上下文关联异常。

复现代码

REPORT ztest.

* Referenzen auf GUI-Objekte
* Splitter
DATA: o_splitter_main TYPE REF TO cl_gui_splitter_container.
* Splitter-Container oben
DATA: o_container_o   TYPE REF TO cl_gui_container.
* Splitter-Container unten
DATA: o_container_u   TYPE REF TO cl_gui_container.

* Splitter auf default_screen erzeugen
o_splitter_main = NEW #( parent                  = cl_gui_container=>default_screen
                         no_autodef_progid_dynnr = abap_true
                         rows                    = 2
                         columns                 = 1 ).

* Höhe oberer Splitter in %
o_splitter_main->set_row_height( id = 1 height = 50 ).
o_container_o = o_splitter_main->get_container( row = 1 column = 1 ).        " MAIN VIEW
o_container_u = o_splitter_main->get_container( row = 2 column = 1 ).        " DETAIL VIEW


START-OF-SELECTION.
* Daten holen
  SELECT *
    INTO TABLE @DATA(it_spfli)
    FROM spfli.

* ALV-Gitter-Objekt erzeugen
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent      = o_container_o " in default container einbetten
                                     i_appl_events = abap_true ).                     " Ereignisse als Applikationsevents registrieren

* Feldkatalog automatisch durch SALV-Objekte erstellen lassen
  DATA: o_salv TYPE REF TO cl_salv_table.

  cl_salv_table=>factory( IMPORTING
                            r_salv_table = o_salv
                          CHANGING
                            t_table      = it_spfli ).

  DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                     r_aggregations = o_salv->get_aggregations( ) ).

  DATA(lv_layout) = VALUE lvc_s_layo(
                                        zebra      = abap_true
                                        cwidth_opt = 'A'
                                        grid_title = 'Testapp'
                                      ).

  DATA ls_variant_det TYPE disvariant.
  ls_variant_det-report   = sy-repid.
  ls_variant_det-username = sy-uname.
  .

* ALV anzeigen
  o_alv->set_table_for_first_display( EXPORTING
                                        i_bypassing_buffer = abap_false  " Puffer ausschalten
                                        i_save             = 'A'         " Anzeigevariante sichern
                                        is_layout          = lv_layout   " Layout
                                        is_variant         = ls_variant_det

                                      CHANGING
                                        it_fieldcatalog    = it_fcat     " Feldkatalog
                                        it_outtab          = it_spfli ). " Ausgabetabelle

* Focus auf ALV setzen
  cl_gui_alv_grid=>set_focus( control = o_alv ).

** leere SAP-Toolbar ausblenden
  cl_abap_list_layout=>suppress_toolbar( ).

** erzwingen von cl_gui_container=>default_screen
  WRITE: space.

问题截图

管理变式界面为空截图

解决方案

核心修正点

  1. 显式绑定ALV的程序与屏幕编号:ALV嵌入拆分器后,变式管理无法自动获取屏幕上下文,需通过set_program_dynnr方法手动指定程序名和默认屏幕号0000。
  2. 完善变式结构的屏幕编号字段:在disvariant结构中补充dynnr = '0000',确保变式检索的上下文一致性。

修正后的完整代码

REPORT ztest.

* Referenzen auf GUI-Objekte
* Splitter
DATA: o_splitter_main TYPE REF TO cl_gui_splitter_container.
* Splitter-Container oben
DATA: o_container_o   TYPE REF TO cl_gui_container.
* Splitter-Container unten
DATA: o_container_u   TYPE REF TO cl_gui_container.

* Splitter auf default_screen erzeugen
o_splitter_main = NEW #( parent                  = cl_gui_container=>default_screen
                         no_autodef_progid_dynnr = abap_true
                         rows                    = 2
                         columns                 = 1 ).

* Höhe oberer Splitter in %
o_splitter_main->set_row_height( id = 1 height = 50 ).
o_container_o = o_splitter_main->get_container( row = 1 column = 1 ).        " MAIN VIEW
o_container_u = o_splitter_main->get_container( row = 2 column = 1 ).        " DETAIL VIEW


START-OF-SELECTION.
* Daten holen
  SELECT *
    INTO TABLE @DATA(it_spfli)
    FROM spfli.

* ALV-Gitter-Objekt erzeugen
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent      = o_container_o
                                     i_appl_events = abap_true ).

* 显式设置ALV关联的程序和屏幕编号
  o_alv->set_program_dynnr( progid = sy-repid dynnr = '0000' ).

* Feldkatalog automatisch durch SALV-Objekte erstellen lassen
  DATA: o_salv TYPE REF TO cl_salv_table.

  cl_salv_table=>factory( IMPORTING
                            r_salv_table = o_salv
                          CHANGING
                            t_table      = it_spfli ).

  DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                     r_aggregations = o_salv->get_aggregations( ) ).

  DATA(lv_layout) = VALUE lvc_s_layo(
                                        zebra      = abap_true
                                        cwidth_opt = 'A'
                                        grid_title = 'Testapp'
                                      ).

  DATA ls_variant_det TYPE disvariant.
  ls_variant_det-report   = sy-repid.
  ls_variant_det-username = sy-uname.
  ls_variant_det-dynnr    = '0000'. " 补充屏幕编号

* ALV anzeigen
  o_alv->set_table_for_first_display( EXPORTING
                                        i_bypassing_buffer = abap_false
                                        i_save             = 'A'
                                        is_layout          = lv_layout
                                        is_variant         = ls_variant_det

                                      CHANGING
                                        it_fieldcatalog    = it_fcat
                                        it_outtab          = it_spfli ).

* Focus auf ALV setzen
  cl_gui_alv_grid=>set_focus( control = o_alv ).

** leere SAP-Toolbar ausblenden
  cl_abap_list_layout=>suppress_toolbar( ).

** erzwingen von cl_gui_container=>default_screen
  WRITE: space.

原理说明

当ALV不直接挂载在默认屏幕时,变式管理对话框无法自动识别屏幕上下文。通过手动绑定程序和默认屏幕号,同时同步disvariant的屏幕编号,确保变式管理能正确检索并展示所有已保存的布局变式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:27:07