我有 2 个屏幕 7000 和 7001,7000 屏幕包含一个按钮,当我们单击它时,它必须导航到 7001 屏幕,但它没有按预期工作。SCREEN 7000 也有一些细节可以显示为 alv。
屏幕正在导航到屏幕 7001,但数据未刷新。任何人都可以帮忙吗?我正在使用 alv 网格容器。对于两个屏幕,我使用相同的 alv 网格
示例代码:
screen 7000 PAI:
WHEN 'DISPLAY'.
call SCREEN 7001.
screen 7001 PBO:
GET REFERENCE OF m_instance->gt_field INTO lr_output.
CREATE OBJECT gr_grid
EXPORTING
i_parent = cl_gui_container=>default_screen.
CALL FUNCTION 'ZLSO_GENERATE_GENERIC_FIELDCAT'
EXPORTING
ir_input_value = lr_output
IMPORTING
et_fieldcat_fcat = lt_fldcat
EXCEPTIONS
xc_invalid_type = 1
xc_empty_table = 2
xc_unknown_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ' Error in generating ALV' TYPE 'E'.
ENDIF.
CALL METHOD gr_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
CHANGING
it_fieldcatalog = lt_fldcat
it_outtab = m_instance->gt_field.
gr_grid->refresh_table_display( ).
Run Code Online (Sandbox Code Playgroud)
1)主要问题
您可能遇到过这样的情况:多个 UI 控件分配给同一个 UI 容器,但仅显示分配的第一个控件。
为了避免这个问题,您必须释放额外的控件,以便只有一个控件保留分配给每个容器。
在您的情况下,您有 2 个 ALV 网格分配给同一个虚拟容器DEFAULT_SCREEN;您的控件是该类的实例CL_GUI_ALV_GRID,您可以调用该方法FREE来释放它。
2)您的代码中还有另一个问题
上面的解决方案应该可以解决您眼前的问题,但这会产生另一个问题,因为您在导航回屏幕 7000 时必须重新实例化 ALV 网格,这将重置滚动位置等。
您可以通过更改代码中的其他内容来避免这种情况,正如我在下面解释的那样。
dynpro(ABAP 屏幕)包含 UI 元素,但如果将控件分配给“虚拟屏幕”( 的任何静态属性*SCREEN*)CL_GUI_CONTAINER,则该控件将显示在 dynpro 上(dynpro 的 UI 元素不会显示在全部,工具栏除外)。
您应该在 dynpro 中定义自定义控制区域,为其命名,而不是使用虚拟屏幕,然后在 PBO 中通过指示区域名称创建自定义容器(类CL_GUI_CUSTOM_CONTAINER),并将 ALV 网格分配给该容器。
如果您在两个屏幕中执行此操作,那么每个容器将只有一个 ALV 网格,并且您无需在每个导航步骤中释放并重新实例化控件。