1. 程式人生 > >ABAP-OOALV定時重新整理執行資料修改事件(無需手動觸發PAI獲取資料)

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
                  
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
        
IMPORTING E_OBJECT E_INTERACTIVE.
    宣告USER-COMMAND 事件方法
    METHODS HANDLE_COMMAND
                  
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
        
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.橙色部分為此功能的主要程式碼

效果展示:

本程式中用以實現輸入銀行科目後隨即帶出其描述,無需回車等操作。