ABAP學習(31):異步Function以及批量數據處理


ABAP異步Function已經批量數據處理

ABAP異步調用Function

調用語法:

CALL FUNCTION Remotefunction STARTING NEW TASK Taskname

DESTINATION IN GROUP {group|DEFAULT}

[{CALLING meth}|{PERFORMING subr} ON END OF TASK]

EXPORTING...

TABLES ...

CHANGING...

EXCEPTIONS...

Taskname:唯一值,多次調用需要生成不同唯一的Taskname;

DESTINATION Dest:指定application servers,Tcode:RZ12,查看最大支持並行數Max. Requests in Que;

[{CALLING meth}|{PERFORMING subr} ON END OF TASK]:設置回調子函數FORM,或回調方法。Method必須是公共Method,並且有輸入參數p_task,類型clike;Subroutine必須Using p_task type clike。p_task其實就是調用時的Taskname。

EXPORTING...:輸入參數

TABLES ...:輸入輸出Table類型參數

EXCEPTIONS...:默認三種Exception,resource_failure,當沒有多余並行資源時,返回這個exception.

[EXCEPTIONS [exc1 = n1 exc2 = n2 ...]
                [system_failure = ns [MESSAGE smess]]
                [communication_failure = nc [MESSAGE cmess]]
                [resource_failure      = nr [MESSAGE rmess]]
                [OTHERS = n_others]].

回調函數接收執行結果:

RECEIVE RESULTS FROM FUNCTION func

parameter list

[KEEPING TASK].

KEEPING TASK:當回調函數執行完后,保持連接,可以通過Taskname執行獲得相同全局參數;

parameter list:異步函數調用參數

[IMPORTING  p1 = a1 p2 = a2 ...]

[TABLES     t1 = itab1 t2 = itab2 ...]

[EXCEPTIONS exc1 = n1 exc2 = n2 ... [MESSAGE mess]

[OTHERS = n_others]].

WAIT阻塞當前主邏輯執行,只有在有回調函數的function使用,阻塞主邏輯,當回調函數執行后,反復執行判斷。

WAIT UNTIL log_exp [UP TO sec SECONDS].

示例1:使用類方法

"類方式異步調用function
CLASS zcl_parellel DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:main.
    CLASS-METHODS:m_callback IMPORTING p_task TYPE clike.
  PRIVATE SECTION.
    TYPES:BEGIN OF s_task,
            name TYPE char10,
            lines TYPE i,
          END OF s_task.
    CLASS-DATA:lt_task TYPE TABLE OF s_task.
    CLASS-DATA:ls_task LIKE LINE OF lt_task.
    CLASS-DATA:lv_count_suc TYPE i.
ENDCLASS.
CLASS zcl_parellel IMPLEMENTATION.
  "實現main函數
  METHOD main.
    DATA:lv_start TYPE i.
    DATA:lv_name TYPE c LENGTH 8.
    DATA:lv_len TYPE i VALUE 10000.
    DATA:lt_table TYPE TABLE OF ztom_data.
    DATA:lv_count_task TYPE i.
    DO 10 TIMES.
      lv_start = ( sy-index - 1 ) * lv_len.
      lv_name = 'tax' && sy-index.
      "異步調用function
      CALL FUNCTION 'ZTOM_MODIFY'
      STARTING NEW TASK lv_name
      DESTINATION IN GROUP 'parallel_generators'
      CALLING m_callback ON END OF TASK
      EXPORTING
        iv_name = lv_name
        iv_start = lv_start
        iv_len = lv_len
      TABLES
        t_data = lt_table
      EXCEPTIONS
        system_failure        = 1
        communication_failure = 2
        resource_failure      = 3.
      IF sy-subrc = 0.
        lv_count_task = lv_count_task + 1.
      ELSE.
        WRITE:/ 'some error'.
      ENDIF.
      WAIT UNTIL lv_count_suc >= lv_count_task.
      LOOP AT lt_task INTO ls_task.
        WRITE:/ ls_task-name,ls_task-lines.
      ENDLOOP.
    ENDDO.
  ENDMETHOD.
  "實現回調函數
  METHOD m_callback.
    DATA:lt_table TYPE TABLE OF ztom_data.
    DATA:lv_line TYPE i.
    RECEIVE RESULTS FROM FUNCTION 'ZTOM_MODIFY'
      TABLES
        t_data = lt_table.
    lv_line = lines( lt_table ).
    "記錄task內表
    CLEAR ls_task.
    ls_task-name = p_task.
    ls_task-lines = lv_line.
    APPEND ls_task TO lt_task.
    "成功回調計數
    lv_count_suc = lv_count_suc + 1.
  ENDMETHOD.
ENDCLASS.
​

方式2:使用Subroutine子函數

FORM f_update_data USING tax_id TYPE clike.
  DATA:lt_table TYPE TABLE OF ztom_data.
  DATA:lv_line TYPE i.
  RECEIVE RESULTS FROM FUNCTION 'ZTOM_MODIFY'
    TABLES
      t_data = lt_table.
  lv_line = lines( lt_table ).
  lv_count_suc = lv_count_suc + 1.
ENDFORM.
"異步function
FORM f_test_parellel.
  "RZ12查看<RFC Serve Group>
  DATA:lv_start TYPE i.
  DATA:lv_len TYPE i VALUE 10000.
  DATA:lv_name TYPE C LENGTH 8.
  DATA:lt_table TYPE TABLE OF ztom_data.

  GET RUN TIME FIELD lv_time_begin.
  DO 10 TIMES.
    lv_start = ( sy-index - 1 ) * lv_len.
    lv_name = 'tax' && sy-index.
    "異步調用function
    CALL FUNCTION 'ZTOM_MODIFY'
    STARTING NEW TASK lv_name
    DESTINATION IN GROUP 'parallel_generators'
    PERFORMING f_update_data ON END OF TASK
    EXPORTING
      iv_name = lv_name
      iv_start = lv_start
      iv_len = lv_len
    TABLES
      t_data = lt_table.
    IF sy-subrc = 0.
      lv_count_parell = lv_count_parell + 1.
    ELSE.
      WRITE:/ 'some error'.
    ENDIF.
  ENDDO.
  WAIT UNTIL lv_count_suc >= lv_count_parell.
  GET RUN TIME FIELD lv_time_end.
  lv_time = lv_time_end - lv_time_begin.
  WRITE:/ lv_time.
ENDFORM.
​

ABAP內表行數最大差不多4千萬筆數據,當數據庫表數據大於這個條數時,對數據進行處理不能一次性讀入內表,需要分批處理。

"大批量數據處理
FORM f_test_select_package.
  DATA:lt_data TYPE TABLE OF ztom_data.
  DATA:ls_data LIKE LINE OF lt_data.
  DATA:lv_c1 TYPE cursor.

  "1.使用select package
  SELECT * INTO TABLE lt_data
    PACKAGE SIZE 100
    FROM ztom_data.
    "中間處理邏輯
    "因為內表容量限制,不能一次性讀入內表處理,將大量數據分100次處理
  ENDSELECT.

  "2.使用open cursor
  OPEN CURSOR lv_c1 FOR
    SELECT * FROM ztom_data.
  DO.
    "每次處理1000條數據
    FETCH NEXT CURSOR lv_c1 INTO TABLE lt_data PACKAGE SIZE 1000.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
    LOOP AT lt_data INTO ls_data.
      "處理讀出來的數據
    ENDLOOP.
  ENDDO.

ENDFORM.
​

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM