从用户命令导航时ALV刷新问题

时间:2019-05-11 14:53:30

标签: abap

我有2个屏幕7000和7001,当我们单击它时,7000屏幕包含一个按钮,它必须导航到7001屏幕,但是它没有按预期工作。 SCREEN 7000还具有一些显示为警报的详细信息。

屏幕正在导航到屏幕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 个答案:

答案 0 :(得分:3)

1)主要问题

可能您遇到了将多个UI控件分配给同一UI容器的情况,只显示了分配的第一个控件。

为避免该问题,您必须释放额外的控件,以便每个容器仅分配一个控件。

在您的情况下,您有2个ALV网格分配给同一虚拟容器DEFAULT_SCREEN;您的控件是类CL_GUI_ALV_GRID的实例,则可以调用方法FREE来释放它。

2)您的代码中还有另一个问题

上面的解决方案应该解决您的直接问题,但这会产生另一个问题,因为导航回到屏幕7000时您必须重新实例化ALV网格,这将重置滚动位置,依此类推。 / p>

您可以通过更改代码中的其他内容来避免这种情况,如下所述。

dynpro(ABAP屏幕)包含UI元素,但是如果您将控件分配给“虚拟屏幕”(*SCREEN*的任何静态属性CL_GUI_CONTAINER),则该控件将显示在dynpro(除工具栏外,dynpro的UI元素完全不显示)。

您应该在dynpro中定义一个custom control area,而不是使用虚拟屏幕,给它起一个名字,然后在PBO中通过指出一个custom container(类CL_GUI_CUSTOM_CONTAINER)来创建一个http://www.utilities-online.info/base64/区域名称,然后将ALV网格分配给该容器。

如果在两个屏幕中执行此操作,则每个容器将只有一个ALV网格,并且无需在每个导航步骤中释放控件并重新实例化。