从用户命令导航时出现 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 控件。