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.
