一步步實現ABAP后台導入EXCEL到數據庫【1】


在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】

  

  

 


免責聲明!

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



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