我有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( ).
答案 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网格,并且无需在每个导航步骤中释放控件并重新实例化。