ALV 网格未刷新

ALV Grid is not refreshed

我的模块池程序中有两个屏幕(屏幕 A 和屏幕 B)。屏幕 A 显示 ALV 网格,工具栏上有 1 个按钮,屏幕 B 也显示 ALV 网格,工具栏上有 1 个按钮。

当我在屏幕 A 上按下“显示订单”按钮时,我被定向到屏幕 B。然后我在屏幕 B 上进行一些编辑操作,单击工具栏上的 'Save' 按钮,然后 'Back' 按钮。

当我在屏幕 A 上为不同的行按下“显示订单”按钮时,我再次被定向到屏幕 B,但是 ALV 网格仍然显示第一个 material 的数据,即它没有t 显示新数据,但显示旧数据。

是否与 cl_gui_cfw=>flush 方法有某种关系?如果是,那么我应该在代码中的什么地方调用它才能显示正确的数据?

屏幕B的PBO模块

CREATE OBJECT zclmz_pp_md_create=>go_container_charg
  EXPORTING
    parent    = cl_gui_container=>screen0
    side      = cl_gui_docking_container=>dock_at_top
    extension = 800.

CREATE OBJECT zclmz_pp_md_create=>go_alv_charg
  EXPORTING
    i_parent = zclmz_pp_md_create=>go_container_charg.

zclmz_pp_md_create=>go_alv_charg->set_table_for_first_display( EXPORTING 
is_layout  = ls_layout CHANGING  it_outtab  =  zclmz_pp_md_create=>gs_plz- 
charg  it_fieldcatalog  = lt_fieldcat ).

B屏PAI模块

zclmz_pp_md_create=>go_alv_charg->refresh_table_display( EXPORTING is_stable = ls_stable ).

CALL METHOD cl_gui_cfw=>flush.

方法 refresh_table_display 应该在屏幕 B 的 PBO 中调用,而不是在 PAI 中调用。

IF zclmz_pp_md_create=>go_alv_charg is NOT BOUND.
    CREATE OBJECT zclmz_pp_md_create=>go_container_charg
    EXPORTING
        parent    = cl_gui_container=>screen0
        side      = cl_gui_docking_container=>dock_at_top
        extension = 800.

    CREATE OBJECT zclmz_pp_md_create=>go_alv_charg
    EXPORTING
        i_parent = zclmz_pp_md_create=>go_container_charg.

    zclmz_pp_md_create=>go_alv_charg->set_table_for_first_display( EXPORTING 
    is_layout  = ls_layout CHANGING  it_outtab  =  zclmz_pp_md_create=>gs_plz- 
    charg  it_fieldcatalog  = lt_fieldcat ).
ELSE.
 zclmz_pp_md_create=>go_alv_charg->refresh_table_display( ).
ENDIF.

这是一个众所周知的控件问题。如果您在容器内实例化一个控件(您的 ALV),其中已经有一个尚未释放的控件,那么旧控件仍然会显示。

两种解决方案:

  • 要么你继续实例化控件,但是你必须释放之前的控件。为此,您必须使用FREE方法,该方法适用于所有类型的控件(甚至可以释放容器本身,然后释放其所有内部控件)。

  • 或者您通过仅实例化控件一次来更改逻辑,然后刷新其内容,就像 Laurens 所说的。

(这个issue和cl_gui_cfw=>顺便flush无关)

另请参阅其他