ABAP:OO ALV没有刷新

时间:2015-03-05 02:37:53

标签: sap abap

我知道我的问题已被问过一百次了。 但我仍然找不到合适的解决方案

  1. 我有一个下拉列表,每次我在下拉列表中更改数据时,它都会根据下拉数据加载新数据
  2. 从第一步开始,我刷新可编辑的ALV
  3. 可以保存可编辑ALV的任何更改(另一个保存操作)
  4. 我的问题是,在我保存后,我无法刷新ALV 但如果我没有按下保存按钮

    ,那就不成问题了

    请帮助我 谢谢

    附加代码 步骤1是#34;当SET_P"在此代码中

    注意: 来自SAP论坛的人告诉我将刷新功能移到PBO,我尝试了但仍然失败了

    MODULE pbo_1000 OUTPUT.
       IF flag = 0.
         SET PF-STATUS '1000'.
         SET TITLEBAR  '1000'.
    
         s_name = sy-uname.
         s_date = sy-datum.
    
         IF s_month IS INITIAL AND s_year IS INITIAL.
           s_month = sy-datum+4(2).
           s_year = sy-datum(4).
         ENDIF.
    
    
         PERFORM create_toolbar.
         PERFORM create_catalog.
         PERFORM select_data.
    
         CREATE OBJECT ob_custom
           EXPORTING
             container_name = 'CCTRL'.
         CREATE OBJECT ob_grid
           EXPORTING
             i_parent      = ob_custom
             i_appl_events = 'X'.
    
    
         PERFORM create_dropbox.
         CALL METHOD ob_grid->set_table_for_first_display
           EXPORTING
             i_structure_name     = 'TYPE'
             it_toolbar_excluding = lt_toolbar
             is_layout            = lyt
           CHANGING
             it_fieldcatalog      = fld[]
             it_outtab            = itab[].
    
         CALL METHOD ob_grid->set_ready_for_input
           EXPORTING
             i_ready_for_input = 1.
    
         CALL METHOD ob_grid->register_edit_event
           EXPORTING
             i_event_id = cl_gui_alv_grid=>mc_evt_enter.
    
       ENDIF.
    ENDMODULE.   
    
    
    
    
    PAI Module
    
    
    
    MODULE user_command_1000 INPUT .
       DATA: v_perio(6) TYPE c.
    
    
       CASE sy-ucomm.
         WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
           LEAVE TO SCREEN 0.
         WHEN 'SAVE'.
           PERFORM save_data.
           PERFORM send_email.
    
         WHEN 'SET_S'.
           flag = 1.
           PERFORM set_status.
           CALL METHOD ob_grid->refresh_table_display
             EXPORTING
               is_stable = stbl.
    
         WHEN 'SET_P'.
           flag = 1.
           PERFORM select_data.
           CALL METHOD ob_grid->refresh_table_display
             EXPORTING
               is_stable      = stbl.
    
    
    
    
    
    
       ENDCASE.
    ENDMODULE. 
    

3 个答案:

答案 0 :(得分:0)

我在应用程序中做了类似的事情,需要在保存时刷新,因为某些计算必须在屏幕上更改。我在命令表单中为'REUSE_ALV_GRID_DISPLAY'功能模块设置了以下代码的一部分。

form user_command using r_ucomm     like sy-ucomm
                        rs_selfield type slis_selfield.
  data: ref_grid type ref to cl_gui_alv_grid, l_valid type c.

  if ref_grid is initial.
    call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      importing
        e_grid = ref_grid.
  endif.

  if not ref_grid is initial.
    call method ref_grid->check_changed_data
      importing
        e_valid = l_valid.
  endif.
  rs_selfield-refresh = 'X'.

  ...

  if not ref_grid is initial.
    call method ref_grid->refresh_table_display( ) .
  endif.

endform.

希望有所帮助

答案 1 :(得分:0)

我猜您需要在PAI中首先调用 CHECK_CHANGED_DATA 方法,这会触发事件 DATA_CHANGED DATA_CHANGED_FINISHED

但最重要的是,它会将OLE对象与实例后端同步,然后当您调用 REFRESH_TABLE_DISPLAY 时,它会正确刷新您的ALV。我目前没有任何例子,但我可以在下周访问系统时尝试。

顺便说一下,在PBO中你不需要变量 flag 你可以使用检查ALV对象是否已经初始化,并根据这个你可以创建/刷新alv。像这样:

if alvGridRef is NOT bound .
  data(container) = new cl_gui_custom_container( ) .
  data(alvGridRef) = new cl_gui_alv_grid( ) .
else .
  alvGridRef->refresh_table_display( ) .
endif .

答案 2 :(得分:0)

您可以通过手动触发PBO 来实现此目的。您说已保存编辑,因此您可以再次在PBO中显示ALV:

CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
           EXPORTING
             functioncode           = 'REFRESH'
           EXCEPTIONS
             function_not_supported = 1 
             OTHERS                 = 2.

执行此操作后,PBO中的sy-ucomm的值为REFRESH