Abap 更新的记录不会显示在子屏幕ALV中

Abap 更新的记录不会显示在子屏幕ALV中,abap,alv,Abap,Alv,我试图在ALV中显示更新的记录,但正在显示旧记录 这是在工单退出屏幕中编写的代码 TRY. cl_salv_table=>factory( EXPORTING r_container = lo_cust_container IMPORTING r_salv_table = lo_alv_table CHANGING t_table = gt_w

我试图在ALV中显示更新的记录,但正在显示旧记录

这是在工单退出屏幕中编写的代码

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container    = lo_cust_container
        IMPORTING
          r_salv_table   = lo_alv_table
        CHANGING
          t_table        = gt_wflog ).

**// Functions
      DATA(lo_alv_functions) = lo_alv_table->get_functions( ).
      lo_alv_functions->set_all( abap_true ).

**// Display Settings
      DATA(lo_alv_display) = lo_alv_table->get_display_settings( ).
      lo_alv_display->set_striped_pattern( abap_true ).

**// Layout Settings
      DATA: ls_layout_key TYPE salv_s_layout_key.
      DATA(lo_alv_layout) = lo_alv_table->get_layout( ).
      ls_layout_key-report = sy-repid.
      lo_alv_layout->set_key( ls_layout_key ).
      lo_alv_layout->set_save_restriction( cl_salv_layout=>restrict_user_independant ).

      lo_alv_columns->set_optimize( abap_true ).
      lo_alv_table->set_data( CHANGING t_table = gt_wflog[] ).
      lo_alv_table->display( ).

    CATCH cx_salv_msg cx_salv_error INTO DATA(lx_salv_msg).
      MESSAGE lx_salv_msg->get_text( ) TYPE 'I'.
  ENDTRY.

我尝试使用方法refresh
lou alv\u table->resfresh()。
带有软刷新或完全刷新选项,但什么也没发生。再次调用子屏幕时,第一次呼叫数据正常,且数据发生变化,则不显示更新的记录。调试期间,我可以在表中看到更新的记录。

这是控件的一个众所周知的问题。如果在容器中实例化任何GUI控件(在您的例子中,它是ALV网格),其中已经有一个控件未被释放(在您的例子中,ALV网格首先使用
cl\u salv\u table=>factory
),那么旧控件仍会显示,新控件不会显示

两种解决方案:

  • 您可以继续实例化该控件,但必须释放以前的控件。为此,必须调用
    control->FREE()
    ,然后调用语句
    FREE control
    。此方法适用于所有控件(即使容器本身可以释放,其所有内部控件也可以释放)

  • 或者通过只实例化一次控件来更改逻辑,并刷新其内容


特殊情况:一些控件可能被一些不允许访问控件的包装类(例如SALV类)包装,因此简单的方法是释放控件所连接的容器。

这是控件的一个众所周知的问题。如果在容器中实例化任何GUI控件(在您的例子中,它是ALV网格),其中已经有一个控件未被释放(在您的例子中,ALV网格首先使用
cl\u salv\u table=>factory
),那么旧控件仍会显示,新控件不会显示

两种解决方案:

  • 您可以继续实例化该控件,但必须释放以前的控件。为此,必须调用
    control->FREE()
    ,然后调用语句
    FREE control
    。此方法适用于所有控件(即使容器本身可以释放,其所有内部控件也可以释放)

  • 或者通过只实例化一次控件来更改逻辑,并刷新其内容


特殊情况:一些控件可能被一些包装类包装,这些包装类不授予对控件的访问权(例如SALV类),因此,最简单的方法是释放控件所连接的容器。

在实例化的第二次调用期间,
TRY
子句捕获了
CX\u SALV\u NO\u NEW\u DATA\u允许的异常。这就是为什么不执行
display()
方法的原因

方法文档中有一个注释:

您无法在事件处理程序中调用这些方法。如果您
你会得到一个错误吗

例外情况
不允许使用新的数据
您已经在事件处理程序中调用了SET_数据

在您的上下文屏幕中,退出与事件处理程序相同,因为它被同一事件调用

解决方案由OP确认:“它工作完美”

添加到顶部包含的声明中

DATA go_alv_table TYPE REF TO cl_salv_table.
在代码中添加

IF go_alv_table IS NOT BOUND.
  cl_salv_table=>factory( )
  ...
ENDIF.
在set_数据方法调用后添加

go_alv_table->refresh( refresh_mode = if_salv_c_refresh=>soft ).

很可能在实例化的第二次调用期间,
TRY
子句捕获了
CX\u SALV\u NO\u NEW\u DATA\u允许的
异常。这就是为什么不执行
display()
方法的原因

方法文档中有一个注释:

您无法在事件处理程序中调用这些方法。如果您
你会得到一个错误吗

例外情况
不允许使用新的数据
您已经在事件处理程序中调用了SET_数据

在您的上下文屏幕中,退出与事件处理程序相同,因为它被同一事件调用

解决方案由OP确认:“它工作完美”

添加到顶部包含的声明中

DATA go_alv_table TYPE REF TO cl_salv_table.
在代码中添加

IF go_alv_table IS NOT BOUND.
  cl_salv_table=>factory( )
  ...
ENDIF.
在set_数据方法调用后添加

go_alv_table->refresh( refresh_mode = if_salv_c_refresh=>soft ).

只是对@suncatcher答案的补充。 首先检查引用变量是否包含有效引用:“IF go\u alv\u grid IS BOUND”

例如:

选择*从zemployees绕过缓冲区进入表it_zemployees

IF go_alv_grid IS BOUND. 
  go_alv_grid->refresh( ).

ELSE.
  cl_salv_table=>factory(
EXPORTING
  r_container    = NEW cl_gui_custom_container( 'CONTAINER_NAME' ) 
  container_name = 'CONTAINER_NAME'
IMPORTING
  r_salv_table   = go_alv_grid
CHANGING
  t_table        = it_zemployees
  ).

  "Style the table
  go_alv_grid->get_functions( )->set_all( ).
  go_alv_grid->get_columns( )->set_optimize( ).
  go_alv_grid->get_display_settings( )->set_striped_pattern( abap_true ).


  go_alv_grid->display( ).
ENDIF.

只是对@suncatcher答案的补充。 首先检查引用变量是否包含有效引用:“IF go\u alv\u grid IS BOUND”

例如:

选择*从zemployees绕过缓冲区进入表it_zemployees

IF go_alv_grid IS BOUND. 
  go_alv_grid->refresh( ).

ELSE.
  cl_salv_table=>factory(
EXPORTING
  r_container    = NEW cl_gui_custom_container( 'CONTAINER_NAME' ) 
  container_name = 'CONTAINER_NAME'
IMPORTING
  r_salv_table   = go_alv_grid
CHANGING
  t_table        = it_zemployees
  ).

  "Style the table
  go_alv_grid->get_functions( )->set_all( ).
  go_alv_grid->get_columns( )->set_optimize( ).
  go_alv_grid->get_display_settings( )->set_striped_pattern( abap_true ).


  go_alv_grid->display( ).
ENDIF.