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


前文:http://www.cnblogs.com/hhelibeb/p/5912330.html

  既然后台作業只能在應用服務器運行,那么,我們可以先將要上傳的數據保存在應用服務器中,之后再以后台作業的形式導入數據庫。這里需要使用的關鍵字是OPEN DATASET。

1. OPEN DATASET 

Syntax

OPEN DATASET dset
  FOR { INPUT | OUTPUT | APPENDING | UPDATE }
  IN { { BINARY MODE }
     | { TEXT MODE ENCODING { DEFAULT
                            | {UTF-8 [SKIPPING|WITH BYTE-ORDER MARK]}
                            | NON-UNICODE }
                   [WITH {NATIVE|SMART|UNIX|WINDOWS} LINEFEED]  }
     | { LEGACY BINARY MODE [{BIG|LITTLE} ENDIAN]
                            [CODE PAGE cp] }
     | { LEGACY TEXT MODE [{BIG|LITTLE} ENDIAN]
                          [CODE PAGE cp]
                          [WITH {NATIVE|SMART|UNIX|WINDOWS} LINEFEED] } }
  [AT POSITION pos]
  [TYPE attr]
  [FILTER opcom]
  [MESSAGE msg]
  [IGNORING CONVERSION ERRORS]
  [REPLACEMENT CHARACTER rc].

效果

  打開由dset指定的應用服務器上的文件。

附加項

 

 

tips: text evirionment

text evirionment是ABAP程序的運行時環境的一部分,由語言、locale和系統內碼表組成。同一個內部會話中的所有程序有一個共同的文本環境。默認情況下,內部會話的text environment由登錄語言決定,並且也可以被語句set locale指定。當前的text environment包含在系統字段sy-langu中

 

 

 

 

    • CODE PAGE cp
      決定文件中字符型數據對象以指定的內碼表cp操作.

 

 

    • TYPE attr
      為文件設置操作系統參數,或者控制文本文件的行尾選項.

 

     例子:    

 

           創建一個文件test.dat。TYPE指定的文件屬性是操作系統IBM i5/OS(在OS/400之前)中的。

OPEN DATASET 'test.dat'
  TYPE 'lrecl=80, blksize=8000, recfm=FB'
  FOR OUTPUT IN TEXT MODE
             ENCODING DEFAULT
             WITH SMART LINEFEED.

 

 

    • MESSAGE msg
      如果發生了錯誤,可以在msg中返回操作系統信息.

 

 

   使用OPEN DATASET來實現上傳數據到應用服務器,即程序中的output_data子進程:

*&---------------------------------------------------------------------*
*&      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 OUTPUT IN TEXT MODE ENCODING DEFAULT.

  IF sy-subrc = 0 .

    LOOP AT itab INTO wa.

      TRANSFER wa TO s_file.

      IF sy-subrc <> 0 .
        MESSAGE 'ERROR!!' TYPE 'E'.
      ENDIF.

    ENDLOOP.

    CLOSE DATASET s_file.

    WRITE: /'寫入服務器文件成功'.

    PERFORM submit_insert_program USING s_file.  "調用導入程序

  ELSE.

    WRITE: /'寫入服務器文件失敗' .

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_file_name_in_server
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM generate_filename_in_server USING s_file .

  DATA s_name TYPE string.

  CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
    EXPORTING
      full_name     = p_source
    IMPORTING
      stripped_name = s_name
*     FILE_PATH     =
    EXCEPTIONS
      x_error       = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  GET TIME.

  CONCATENATE '/tmp/' sy-datum  sy-uzeit s_name  '.txt' INTO s_file.

  TRANSLATE s_file TO LOWER CASE.

ENDFORM.

 

2,實現導入程序

  上傳到服務器的程序已經實現,現在新建一個程序ztest_import,實現導入到數據庫的功能。同樣使用OPEN DATASET語句來實現:

REPORT ztest_import.

SELECTION-SCREEN: BEGIN OF BLOCK blk.
PARAMETERS: s_file TYPE rlgrap-filename .
SELECTION-SCREEN END OF BLOCK blk.


DATA: BEGIN OF wa,
        col1(30) TYPE c,
        col2(30) TYPE c,
        col3(30) TYPE c,
      END OF wa.

FIELD-SYMBOLS: <hex_container> TYPE c.

TRANSLATE s_file TO LOWER CASE.


OPEN DATASET s_file FOR INPUT IN TEXT  MODE ENCODING DEFAULT.

IF sy-subrc = 0.

  ASSIGN wa TO <hex_container> CASTING.

  DO.
    "由於沒有使用MAXIMUM LENGTH選項,所以每次讀取的最大字節數
    "由<hex_container>所占字節數決定
    READ DATASET s_file INTO <hex_container>.

    IF sy-subrc = 0.

*"ztestly是在SE11中新建的表,結構和上傳的excel相符,過程省略

      INSERT ztestly FROM wa. 

    ELSE.

      EXIT.

    ENDIF.

  ENDDO.

  CLOSE DATASET s_file.

  DELETE DATASET s_file.  "成功執行導入后,刪除服務器上的文件

ELSE.

  MESSAGE 'open failed' TYPE 'I

 

3,在上傳程序中調用導入程序

  如果你看過我博客中有關submit的文章,可能會記得,submit語句是可以安排程序作為后台作業進行的。下面我們就使用這個特性,在上傳程序ztest_upload的子程序submit_insert_program中調用導入程序ztest_import,代碼如下:

*&---------------------------------------------------------------------*
*&      Form  SUBMIT_INSERT_PROGRAM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM submit_insert_program USING s_file.

  DATA: w_jobid  TYPE tbtcjob-jobcount,
        w_stepnm TYPE tbtcjob-stepcount,
        p_job_nm TYPE tbtcjob-jobname VALUE  'ZTEST_IMPORT'.

  CLEAR:w_jobid.

  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
*     DELANFREP        = ' '
*     JOBGROUP         = ' '
      jobname          = p_job_nm
*     SDLSTRTDT        = NO_DATE
*     SDLSTRTTM        = NO_TIME
    IMPORTING
      jobcount         = w_jobid
    EXCEPTIONS
      cant_create_job  = 1
      invalid_job_data = 2
      jobname_missing  = 3
      OTHERS           = 4.

  SUBMIT ztest_import WITH s_file = s_file VIA JOB p_job_nm NUMBER w_jobid  AND RETURN.

  IF sy-subrc = 0.

    CALL FUNCTION 'JOB_CLOSE'
      EXPORTING
        jobcount             = w_jobid
        jobname              = p_job_nm
        strtimmed            = 'X'
      EXCEPTIONS
        cant_start_immediate = 1
        invalid_startdate    = 2
        jobname_missing      = 3
        job_close_failed     = 4
        job_nosteps          = 5
        job_notex            = 6
        lock_failed          = 7
        OTHERS               = 8.

    IF sy-subrc <> 0.
      WRITE: /'后台作業發布失敗'.
    ELSE.
      WRITE: /'后台作業發布成功'.
    ENDIF.

  ENDIF.

ENDFORM.

  運行zterst_upload,上傳一個有效的excel文件,我們便可以在上一篇文章提到的自有作業界面看到后台作業執行成功,並且在SE16中查到自建表zestly中已經插入了相關數據。如果要改變后台作業的計划時間,可以在JOB_CLOSE函數中設置相關參數。

 


免責聲明!

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



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