我的模块池程序中有两个屏幕(屏幕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.
方法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 所说。
(顺便说一下,该问题与cl_gui_cfw=>flush无关)
另请参阅此其他答案。