在SAP的應用當中,導入、導出EXCEL文件的情況是一個常見的需求,有時候用戶需要將大量數據定期導入到SAP的數據庫中。這種情況下,使用導入程序在前台導入可能要花費不少的時間,如果能安排導入程序為后台作業,既可以節約用戶的時間,也可以有效利用閑時的服務器資源,最重要的是可以避開程序超時。下面來介紹一下相關的知識和具體實踐辦法。
本文鏈接:http://www.cnblogs.com/hhelibeb/p/5912330.html
原創內容,轉載請注明
1,定義結構
首先,新建程序ztest_upload,並准備一個EXCEL文件。假設一個相對簡單的情景,比如,要上傳的數據庫表有三個字段。那么我們也建立一個三列內容的EXCEL文件,test.xlsx:
由此,可以在代碼中定義相應的內表itab:
REPORT ztest_upload. DATA: BEGIN OF wa, col1(30) TYPE c, col2(30) TYPE c, col3(30) TYPE c, END OF wa. DATA itab LIKE STANDARD TABLE OF wa.
2,上傳並讀取文件
我們需要有一個選擇屏幕,用於指定文件的路徑:
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001. PARAMETERS: p_source TYPE rlgrap-filename DEFAULT 'C:\Users\liyue\Desktop\test.xlsx' MODIF ID ty1. SELECTION-SCREEN END OF BLOCK block
添加文件選擇幫助:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_source. PERFORM get_filename.
FORM get_filename. TRY. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING mask = '*.XLSX.' mode = 'O' IMPORTING filename = p_source EXCEPTIONS inv_winsys = 01 no_batch = 02 selection_cancel = 03 selection_error = 04. ENDTRY. IF p_source EQ ''. MESSAGE s000(zfi01) WITH '未選擇文件!' DISPLAY LIKE 'E'. ENDIF. ENDFORM.
運行程序后,使用ALSM_EXCEL_TO_INTERNAL_TABLE函數讀取文件:
START-OF-SELECTION. PERFORM read_data. PERFORM output_data. *&---------------------------------------------------------------------* *& Form FRM_READ_DATA *&---------------------------------------------------------------------* * 讀取上傳的EXCEL文件 *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM read_data . TRY. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = p_source i_begin_col = 1 i_begin_row = 1 i_end_col = 255 i_end_row = 3 TABLES intern = gt_excel[] EXCEPTIONS inconsistent_parameters = 1 s_file_ole = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE s000(zfi01) WITH '文件打開失敗!' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. * CATCH icx_obl_parameter_error INTO . ENDTRY. FIELD-SYMBOLS <fs_value>. FIELD-SYMBOLS <fs_excel> LIKE gt_excel. SORT gt_excel BY row col. LOOP AT gt_excel ASSIGNING <fs_excel>. ASSIGN COMPONENT <fs_excel>-col OF STRUCTURE wa TO <fs_value>. <fs_value> = <fs_excel>-value. AT END OF row. APPEND wa TO itab. CLEAR wa. ENDAT. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form OUTPUT_DATA *&---------------------------------------------------------------------* * 將數據寫入到Applacation Server *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM output_data . DATA s_file TYPE rlgrap-filename. PERFORM generate_filename_in_server USING s_file. OPEN DATASET s_file FOR INPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = 0 . LOOP AT itab INTO wa. write: \ wa. ENDLOOP. ENDFORM.
這里沒有使用INSERT語句插入數據庫,因為我們還沒有建立相應的數據庫表:) 因此,先使用write驗證數據讀取的情況。
接下來是安排程序作為后台作業運行。在選擇屏幕點擊F9,安排程序立刻作為后台作業執行,(如果運行成功的話,在假脫機日志中可以查看到write輸出的文件內容):
保存之后查看運行結果,打開工具欄——系統——自有作業
嗯....什么,已取消?看來作業失敗了,得分析下原因才行。雙擊任務名,點擊“任務日志”按鈕查看:
原來,在后台作業中,ALSM_EXCEL_TO_INTERNAL_TABLE函數並沒有正確讀取到文件的內容。
在SCN上查詢這個問題,可以發現,有很多人踩過這個坑。也有人給出了解釋:之所以無法讀取相應的文件內容,是因為后台作業實際上運行在ABAP應用服務器層面(Application Servers),而不是表現層(Presentation),當然也就不可能按照給定的路徑讀取文件了。
tips: SAP系統架構
1.最底層是數據庫層。SAP自己並不提供底層數據庫,而使用其他廠商的數據庫管理系統(支持所有的主流數據庫)。當然,現在已經有了HANA。只有SAP自身管理和運行所需的程序和元數據沒有保存在數據庫里,而應用系統運行的幾乎所有數據都存儲在數據庫中。 2.ABAP程序運行在應用服務層。ABAP程序包括SAP提供的標准程序和我們自己開發的程序。ABAP程序從數據庫讀數據,處理數據,有可能還要儲存數據。 3.第三層是表示層。這一層就是用戶界面,用戶可以通過它訪問程序,輸入數據,接收工作進程處理的結果。SAP把表示層也稱為服務器,因為它的工作模式跟web瀏覽器類似,負責把應用服務器傳來的界面布局數據轉換成用戶可瀏覽的界面,這種處理也可以成為一種‘服務’。
在SAP系統中,軟件的技術分布完全獨立與它所安裝硬件的物理位置。 對於用戶來說,SAP系統的應用層和數據庫就是一個Black Box。從技術角度講,有三種類型的屏幕:標准屏幕、選擇屏幕和清單,沒中屏幕為用戶提供不同的服務。程序員應該根據任務的需要,為用戶提供合適的屏幕。 |
看來,我們有必要找到一種折衷的方式來實現后台導入數據到數據庫。接下來的內容請看一步步實現ABAP后台導入EXCEL到數據庫【2】。