拆分器容器中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.
问题截图

解决方案
核心修正点
- 显式绑定ALV的程序与屏幕编号:ALV嵌入拆分器后,变式管理无法自动获取屏幕上下文,需通过
set_program_dynnr方法手动指定程序名和默认屏幕号0000。 - 完善变式结构的屏幕编号字段:在
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
相关产品推荐
相关产品推荐

