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

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 窗口.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值