ABAP-OOALV定時重新整理執行資料修改事件(無需手動觸發PAI獲取資料)
程式碼部分:
DATA GO_TIMER TYPE REF TO CL_GUI_TIMER.
*--------------------------------------------------------------------
* CLASS cl_event_receiver DEFINITION
*--------------------------------------------------------------------
*--------------------------------------------------------------------
CLASS CL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
" 宣告TOOLBAR事件方法
METHODS HANDLE_TOOLBAR
IMPORTING E_OBJECT E_INTERACTIVE.
" 宣告USER-COMMAND 事件方法
METHODS HANDLE_COMMAND
IMPORTING E_UCOMM.
" ENTE時觸發
METHODS HANDLE_ENTE
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED ET_GOOD_CELLS.
METHODS HANDLE_TIMER
FOR EVENT FINISHED OF CL_GUI_TIMER.
PRIVATE SECTION.
ENDCLASS. "CL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT_RECEIVER IMPLEMENTATION.
" 實現ENTE 事件方法
METHOD HANDLE_ENTE.
DATA GS_LAYOUT_ALV TYPE LVC_S_LAYO.
DATA LV_STABLE TYPE LVC_S_STBL. "重新整理穩定性
PERFORM FOM_REFRESH . "獲取描述
LV_STABLE-ROW = '1'.
LV_STABLE-COL = '1'.
GS_LAYOUT_ALV-CWIDTH_OPT = 'X'. "優化列寬
CALL METHOD GO_ALV_GRID->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GS_LAYOUT_ALV.
CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = GO_ALV_GRID.
CALL METHOD CL_GUI_CFW=>FLUSH.
*
CALL METHOD GO_TIMER->RUN "必須重新啟用定時器
EXCEPTIONS
OTHERS = 9.
ENDMETHOD. "HANDLE_MODIFY
METHOD HANDLE_TIMER.
*--------------------------------------------------------------------
CALL METHOD CL_GUI_CFW=>DISPATCH.
CALL METHOD GO_ALV_GRID->CHECK_CHANGED_DATA.
*--------------------------------------------------------------------
DATA GS_LAYOUT_ALV TYPE LVC_S_LAYO.
DATA LV_STABLE TYPE LVC_S_STBL. "重新整理穩定性
PERFORM FOM_REFRESH . "獲取銀行科目描述
LV_STABLE-ROW = '1'.
LV_STABLE-COL = '1'.
GS_LAYOUT_ALV-CWIDTH_OPT = 'X'. "優化列寬
CALL METHOD GO_ALV_GRID->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GS_LAYOUT_ALV.
CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = GO_ALV_GRID.
CALL METHOD CL_GUI_CFW=>FLUSH.
CALL METHOD GO_TIMER->RUN "重新啟用定時器
EXCEPTIONS
OTHERS = 9.
ENDMETHOD. "handle_timer
ENDCLASS. "cl_event_receiver IMPLEMENTATION
DATA L_FCAT_CACHE TYPE LVC_T_FCAT.
DATA WA_LAYOUT_CACHE TYPE LVC_S_LAYO.
DATA WA_FIELD TYPE LVC_S_FCAT.
DATA LO_EVENT TYPE REF TO CL_EVENT_RECEIVER.
CREATE OBJECT LO_CONTAINER
EXPORTING
CONTAINER_NAME = 'CONT01'.
CREATE OBJECT GO_ALV_GRID
EXPORTING
I_PARENT = LO_CONTAINER.
DEFINE FILL_FIELD.
wa_field-fieldname = &1.
wa_field-coltext = &2.
IF wa_field-fieldname = 'FSFNS'
OR wa_field-fieldname = 'AFLAG'
.
wa_field-checkbox = 'X'.
wa_field-edit = 'X'.
ENDIF.
IF wa_field-fieldname = 'UMSKZ'
OR wa_field-fieldname = 'WRBYS'
OR wa_field-fieldname = 'SAKYH'
OR wa_field-fieldname = 'WRBXX'
OR wa_field-fieldname = 'GZDAT'
.
wa_field-edit = 'X'.
ENDIF.
IF wa_field-fieldname = 'GZDAT'.
wa_field-ref_table = 'VBAK'.
wa_field-ref_field = 'ERDAT'.
ENDIF.
IF wa_field-fieldname = 'SAKYH'.
wa_field-ref_table = 'SKA1'.
wa_field-ref_field = 'SAKNR'.
ENDIF.
IF wa_field-fieldname = 'WRBYS'
OR wa_field-fieldname = 'WRBXX'.
wa_field-ref_table = 'BSEG'.
wa_field-REF_FIELD = 'WRBTR'.
ENDIF.
*BSEG-WRBTR
APPEND wa_field TO l_fcat_cache .
CLEAR wa_field.
END-OF-DEFINITION.
FILL_FIELD :
'AFLAG' '選擇',
'BUKRS_VF' '公司程式碼',
'KUNNR' '客戶',
'NAME1' '客戶名稱',
'VBELN' '銷售訂單',
'WAERK' '貨幣',
'UMSKZ' 'SGL標誌',
'SKONT' '預收科目',
'WRBYS' '預收款',
'SAKYH' '銀行科目',
'TXT20' '銀行科目描述',
'FSFNS' '是否繳稅',
'WRBXX' '銷項稅',
'SAKXX' '銷項稅科目',
'RACQT' '其他應收科目',
'GZDAT' '過賬日期',
'GJAHR' '會計年度',
'ZKJQJ' '期間',
'BELNR' '會計憑證號碼'.
* 設定enter事件
CALL METHOD GO_ALV_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2.
CREATE OBJECT LO_EVENT.
SET HANDLER LO_EVENT->HANDLE_TOOLBAR FOR GO_ALV_GRID.
SET HANDLER LO_EVENT->HANDLE_COMMAND FOR GO_ALV_GRID.
SET HANDLER LO_EVENT->HANDLE_ENTE FOR GO_ALV_GRID.
* SET HANDLER LO_EVENT->HANDLE_DATA_CHANGED FOR GO_ALV_GRID.
CREATE OBJECT GO_TIMER
EXCEPTIONS
OTHERS = 9.
SET HANDLER LO_EVENT->HANDLE_TIMER FOR GO_TIMER.
GO_TIMER->INTERVAL = 3. "設定間隔為3秒
CALL METHOD GO_TIMER->RUN
EXCEPTIONS
OTHERS = 9.
WA_LAYOUT_CACHE-CWIDTH_OPT = 'X'. "優化列寬
CALL METHOD GO_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = WA_LAYOUT_CACHE
CHANGING
IT_FIELDCATALOG = L_FCAT_CACHE
IT_OUTTAB = GT_DATA[].
PS:
1.定時重新整理相當於對螢幕上不屬於alv的部分觸發PAI,這樣前臺寫入的資料會隨著定時重新整理兒失效,加入上面紅字標註的程式碼處理之後便可解決問題。
2.如果在ALV中設定了很多事件則要在對應的方法中呼叫
CALL METHOD GO_TIMER->RUN "重新啟用定時器
EXCEPTIONS
OTHERS = 9.
用以重新啟用定時器。
3.橙色部分為此功能的主要程式碼
效果展示:
本程式中用以實現輸入銀行科目後隨即帶出其描述,無需回車等操作。