ALV网格未刷新

时间:2018-12-29 10:55:55

标签: sap abap alv

我的模块池程序中有两个屏幕(屏幕A和屏幕B)。屏幕A显示ALV网格并在工具栏上具有1个按钮,屏幕B也显示ALV网格并在工具栏上具有1个按钮。
当我按下屏幕A上的“显示订单”按钮时,我被定向到屏幕B。然后在屏幕B上进行一些编辑操作,单击工具栏上的“保存”按钮,然后单击“返回”按钮。 当我按下屏幕A上另一行的“显示订单”按钮时,我再次被引导到屏幕B,但是ALV网格仍然显示来自第一个物料的数据,即,它不显示新数据,而是显示旧数据。 它是否与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.

2 个答案:

答案 0 :(得分:2)

方法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.

答案 1 :(得分:1)

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

两种解决方案:

  • 要么继续实例化控件,但随后必须释放以前的控件。为此,必须使用FREE方法,该方法可用于所有控件(即使容器本身可以被释放,然后释放其所有内部控件)。

  • 或者您只需实例化一次控件即可更改逻辑,然后刷新其内容,如Laurens所说。

(该问题与cl_gui_cfw =>冲洗无关)