从用户命令导航时出现 ALV 刷新问题
ALV refresh problem while navigating from user command
我有 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( ).
1) 主要问题
您可能遇到这样的情况,多个 UI 控件分配给同一个 UI 容器,只显示第一个分配的控件。
为避免该问题,您必须释放额外的控件,以便每个容器只保留一个控件。
在你的例子中,你有 2 个 ALV 网格分配给同一个虚拟容器 DEFAULT_SCREEN
;您的控件是 class CL_GUI_ALV_GRID
的一个实例,您可以调用方法 FREE
来释放它。
2) 你的代码还有问题
上面的解决方案应该可以解决您眼前的问题,但这会产生另一个问题,因为当导航回屏幕 7000 时您必须 re-instantiate ALV 网格,这将重置滚动位置和等等。
您可以通过更改代码中的其他内容来避免它,正如我在下面解释的那样。
dynpro(ABAP 屏幕)包含 UI 个元素,但是如果您将控件分配给 "dummy screen"(CL_GUI_CONTAINER
的任何静态属性 *SCREEN*
) , 此控件将显示在 dynpro 上(dynpro 的 UI 元素根本不显示,工具栏除外)。
不使用虚拟屏幕,您应该通过指示区域名称定义一个 custom control area in your dynpro, give it a name, then in the PBO, create a custom container (class CL_GUI_CUSTOM_CONTAINER
),并将 ALV 网格分配给该容器。
如果您在两个屏幕中这样做,那么每个容器只有一个 ALV 网格,并且您不需要在每个导航步骤中释放和 re-instantiate 控件。
我有 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( ).
1) 主要问题
您可能遇到这样的情况,多个 UI 控件分配给同一个 UI 容器,只显示第一个分配的控件。
为避免该问题,您必须释放额外的控件,以便每个容器只保留一个控件。
在你的例子中,你有 2 个 ALV 网格分配给同一个虚拟容器 DEFAULT_SCREEN
;您的控件是 class CL_GUI_ALV_GRID
的一个实例,您可以调用方法 FREE
来释放它。
2) 你的代码还有问题
上面的解决方案应该可以解决您眼前的问题,但这会产生另一个问题,因为当导航回屏幕 7000 时您必须 re-instantiate ALV 网格,这将重置滚动位置和等等。
您可以通过更改代码中的其他内容来避免它,正如我在下面解释的那样。
dynpro(ABAP 屏幕)包含 UI 个元素,但是如果您将控件分配给 "dummy screen"(CL_GUI_CONTAINER
的任何静态属性 *SCREEN*
) , 此控件将显示在 dynpro 上(dynpro 的 UI 元素根本不显示,工具栏除外)。
不使用虚拟屏幕,您应该通过指示区域名称定义一个 custom control area in your dynpro, give it a name, then in the PBO, create a custom container (class CL_GUI_CUSTOM_CONTAINER
),并将 ALV 网格分配给该容器。
如果您在两个屏幕中这样做,那么每个容器只有一个 ALV 网格,并且您不需要在每个导航步骤中释放和 re-instantiate 控件。