OOALV 中DATA_CHANGED_FINISHED调用刷新弹出排序窗口解决方案
生活随笔
收集整理的這篇文章主要介紹了
OOALV 中DATA_CHANGED_FINISHED调用刷新弹出排序窗口解决方案
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
DATA_CHANGED_FINISHED 中使用刷新方法REFRESH_TABLE_DISPLAY 會(huì)導(dǎo)致sort 出現(xiàn)強(qiáng)制彈出選擇字段的窗口的異常情況.
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.?
" 類實(shí)現(xiàn)
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’." 基于行的穩(wěn)定刷新
STBL-COL = 'X'." 基于列穩(wěn)定刷新
CALL METHOD SENDER->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STBL
I_SOFT_REFRESH = SPACE.
ENDFORM. " REFRESH_TABLE_DISPLAY
經(jīng)過自己研究,可用以下方案解決:
event class 中設(shè)置 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 事件中. 調(diào)用增加判斷變量
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
解決思路:
首先,當(dāng)我們使用標(biāo)準(zhǔn)的排序功能由于是system event 不觸發(fā)user command 事件 不觸發(fā)data changed事件,以及不觸發(fā)data changed finished 事件
其次由于data changed finished 事件中無法獲取 system event 的 ucomm ,所以無法直接判斷是否刷新. cl_gui_alv_grid中的u_ucomm 是protected 屬性,無法直接讀取。
最后,如果我們操作內(nèi)表數(shù)據(jù)(check box 選取),必然觸發(fā)data changed 事件,只有觸發(fā)data changed事件的動(dòng)作,我們才去刷新OO ALV 內(nèi)表. 直接使用system event 事件的排序功能, 必然在data changed finished 不走REFRESH_TABLE_DISPLAY ,從而不會(huì)彈出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.?
" 類實(shí)現(xiàn)
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’." 基于行的穩(wěn)定刷新
STBL-COL = 'X'." 基于列穩(wěn)定刷新
CALL METHOD SENDER->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STBL
I_SOFT_REFRESH = SPACE.
ENDFORM. " REFRESH_TABLE_DISPLAY
經(jīng)過自己研究,可用以下方案解決:
event class 中設(shè)置 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 事件中. 調(diào)用增加判斷變量
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
解決思路:
首先,當(dāng)我們使用標(biāo)準(zhǔn)的排序功能由于是system event 不觸發(fā)user command 事件 不觸發(fā)data changed事件,以及不觸發(fā)data changed finished 事件
其次由于data changed finished 事件中無法獲取 system event 的 ucomm ,所以無法直接判斷是否刷新. cl_gui_alv_grid中的u_ucomm 是protected 屬性,無法直接讀取。
最后,如果我們操作內(nèi)表數(shù)據(jù)(check box 選取),必然觸發(fā)data changed 事件,只有觸發(fā)data changed事件的動(dòng)作,我們才去刷新OO ALV 內(nèi)表. 直接使用system event 事件的排序功能, 必然在data changed finished 不走REFRESH_TABLE_DISPLAY ,從而不會(huì)彈出sort 窗口.
總結(jié)
以上是生活随笔為你收集整理的OOALV 中DATA_CHANGED_FINISHED调用刷新弹出排序窗口解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SY-SUBRC 的含义
- 下一篇: ALV DataChange EVENT