当前位置 : 首页 » 博文聚焦 » 正文

OOALV 中DATA_CHANGED_FINISHED调用刷新弹出排序窗口解决方案

分类 : 博文聚焦 | 发布时间 : 2016-03-08 09:49:41 | 浏览 : 1205
DATA_CHANGED_FINISHED 中使用刷新方法REFRESH_TABLE_DISPLAY 会导致sort 出现强制弹出选择字段的窗口的异常情况.
CLASS LCL_EVENTS DEFINITION.
METHODS DATA_CHANGED_FINISHED
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED
ET_GOOD_CELLS
SENDER. 
METHODS HANDLE_DATA_CHANGED 
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED.

PRIVATE SECTION.
DATA G_REFRESH TYPE C.
ENDCLASS. 
" 类实现
CLASS LCL_APPLICATION IMPLEMENTATION. 
METHOD DATA_CHANGED_FINISHED.
PERFORM DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS SENDER G_REFRESH.
ENDMETHOD. 
METHOD HANDLE_DATA_CHANGED.
G_REFRESH = 'X'.
PERFORM EVENT_DATA_CHANGED USING ER_DATA_CHANGED
ERROR_IN_DATA
ME.
ENDMETHOD. "data_changed
ENDCLASS. 
"刷新oo alv subroutine:
PERFORM REFRESH_TABLE_DISPLAY USING SENDER.
FORM REFRESH_TABLE_DISPLAY USING SENDER TYPE REF TO CL_GUI_ALV_GRID.

DATA: STBL TYPE LVC_S_STBL.

STBL-ROW = ‘X’." 基于行的稳定刷新
STBL-COL = 'X'." 基于列稳定刷新

CALL METHOD SENDER->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STBL
I_SOFT_REFRESH = SPACE.

ENDFORM. " REFRESH_TABLE_DISPLAY

经过自己研究,可用以下方案解决:
event class 中设置 private 变量
1) 
PRIVATE SECTION.
DATA G_REFRESH TYPE C.
2) 激活 DATA_CHANGED 事件. 将全局变量赋值.
METHOD HANDLE_DATA_CHANGED.
G_REFRESH = ‘X’.
ENDMETHOD. "DATA_CHANGED
3) DATA_CHANGED_FINISHED 事件中. 调用增加判断变量

METHOD DATA_CHANGED_FINISHED.
PERFORM DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS SENDER G_REFRESH.
ENDMETHOD. "DATA_CHANGED_FINISHED 

FORM DATA_CHANGED_FINISHED USING E_MODIFIED
ET_GOOD_CELLS TYPE LVC_T_MODI
SENDER TYPE REF TO CL_GUI_ALV_GRID
REFRESH. 
IF REFRESH = 'X'.
PERFORM REFRESH_TABLE_DISPLAY USING SENDER.
CLEAR REFRESH .
ENDIF.
ENDFORM. " DATA_CHANGED_FINISHED


解决思路:
首先,当我们使用标准的排序功能由于是system event 不触发user command 事件 不触发data changed事件,以及不触发data changed finished 事件
其次由于data changed finished 事件中无法获取 system event 的 ucomm ,所以无法直接判断是否刷新. cl_gui_alv_grid中的u_ucomm 是protected 属性,无法直接读取。
最后,如果我们操作内表数据(check box 选取),必然触发data changed 事件,只有触发data changed事件的动作,我们才去刷新OO ALV 内表. 直接使用system event 事件的排序功能, 必然在data changed finished 不走REFRESH_TABLE_DISPLAY ,从而不会弹出sort 窗口.

相关阅读:

FI--数据表图

本地文件上传、下载服务器文件事物码

SAP FI常用事务码

SD--如何在输出控制中增加自定义字段

SAP ABAP 异常处理

ABAP高效率批量修改内表的数据

OO-ALV标准工具栏按钮

更改记录表CDHDR和CDPOS

sap中二级品报工问题解决方案

OOALV 中DATA_CHANGED_FINISHED调用刷新弹出排序窗口解决方案