[SAP ABAP開發技術總結]FTP到文件服務器,服務器上文件讀寫



FTP文件到文件服務器
服務器上文件讀寫

20.3.     FTP

CONSTANTS: c_key TYPE i VALUE 26101957."密鑰
CONSTANTS: c_pwd(10) VALUE 'suning@123'.
CONSTANTS: c_user(6) VALUE 'sh_set'.
CONSTANTS: c_host(14) VALUE '192.168.118.81'.
**SAPFTPA:表示以SAP服務器為目的地,上傳與下載都會放在SAP服務器上;SAPFTP:以Client端為目的地
CONSTANTS: c_rfcdest LIKE rfcdes-rfcdest VALUE 'SAPFTPA'.
DATA:lv_pwd(40).
DATA:lv_command(99),
     lv_len         TYPE i,
     lv_hdl         TYPE i.
DATA: BEGIN OF lt_result OCCURS 0,
        line(100) TYPE c,
      END OF lt_result.

DATA:lv_filename TYPE char128.
DATA oref TYPE REF TO cx_root.

DATA: BEGIN OF lt_data_txt OCCURS 0 ,
        line(500),
      END OF lt_data_txt.

DATA: BEGIN OF lt_data_binary OCCURS 0,
        x(2000) TYPE x,
      END OF lt_data_binary.
DATA: lv_binary_len TYPE i.
DATA:  l_codepage(4) TYPE n .
DATA:  l_encoding(20).

GET TIME.
* temp file name 用戶名 日期 時間 傳入的文件名
CONCATENATE sy-datum sy-uzeit INTO lv_filename.

* 將密碼轉化為SAP的格式
lv_len = strlen( c_pwd ).
CALL FUNCTION 'HTTP_SCRAMBLE'
  EXPORTING
    source      = c_pwd
    sourcelen   = lv_len
    key         = c_key
  IMPORTING
    destination = lv_pwd. "加密密碼


DATA: ls_ftpserver TYPE sapftp_servers.
SELECT SINGLE * FROM sapftp_servers  INTO ls_ftpserver WHERE ftp_server_name = c_host AND ftp_server_port = 21.
IF sy-subrc <> 0.
  ls_ftpserver-ftp_server_name = c_host.
  ls_ftpserver-ftp_server_port = 21.
  ls_ftpserver-description = '售后結算清單簽章HTML文件服務'.
  INSERT INTO sapftp_servers VALUES ls_ftpserver .
  COMMIT WORK AND WAIT.
ENDIF.

TRY .
    CALL FUNCTION 'FTP_CONNECT'
      EXPORTING
        user            = c_user
        password        = lv_pwd
        host            = c_host
        rfc_destination = c_rfcdest
      IMPORTING
        handle          = lv_hdl.
  CATCH cx_root INTO oref.
    MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
ENDTRY.

** 進入指定的FTP服務器目錄
lv_command = 'cd /sh_settlement'.

TRY .
    CALL FUNCTION 'FTP_COMMAND'
      EXPORTING
        handle  = lv_hdl
        command = lv_command
      TABLES
        data    = lt_result.
    LOOP AT lt_result.
      WRITE:/ lt_result.
    ENDLOOP.
  CATCH cx_root INTO oref.
    MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
    PERFORM frm_disconnect.
    RETURN.
ENDTRY.

APPEND '江' TO lt_data_txt.
APPEND 'a' TO lt_data_txt.

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
  EXPORTING
    external_name = 'GB2312'
  IMPORTING
    sap_codepage  = l_codepage.
l_encoding = l_codepage.

TRY.
**將文本內表轉換為某種編碼格式的二進制碼流內表
    CALL FUNCTION 'SCMS_TEXT_TO_BINARY'
      EXPORTING
        encoding      = l_encoding
      IMPORTING
        output_length = lv_binary_len "編碼后占多少字節
      TABLES
        text_tab      = lt_data_txt
        binary_tab    = lt_data_binary.
  CATCH cx_root INTO oref.
    MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
ENDTRY.


TRY .
    CALL FUNCTION 'FTP_R3_TO_SERVER'
      EXPORTING
        handle      = lv_hdl
        fname       = lv_filename
        blob_length = lv_binary_len
      TABLES
        blob        = lt_data_binary. "二進制輸出
  CATCH cx_root INTO oref.
    MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
    PERFORM frm_disconnect.
    RETURN.
ENDTRY.



FORM frm_disconnect.
* disconnect
* 關閉SAP與其他系統的連接
  CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      handle = lv_hdl.

*關閉SAP與其他系統的RFC連接.
  CALL FUNCTION 'RFC_CONNECTION_CLOSE'
    EXPORTING
      destination = c_rfcdest
    EXCEPTIONS
      OTHERS      = 1.
ENDFORM.

 

20.4.     文件讀寫

DATA: file TYPE string VALUE `jzjflights.dat`,
      wa  
TYPE spfli
.
OPEN DATASET file FOR OUTPUT IN BINARY MODE.
SELECT *
      
FROM
spfli
      
INTO wa.

 
TRANSFER wa TO file. "
ENDSELECT.
CLOSE DATASET file.

 

DATA: file TYPE string VALUE `jzjflights.dat`,
      wa  
TYPE spfli
.
OPEN DATASET file FOR INPUT IN BINARY MODE.
DO.
 
"由於沒有使用MAXIMUM LENGTH選項,所以每次讀取的最大字節數由wa
所占字節數決定
  READ DATASET file INTO wa. "
 
IF sy-subrc = 0.
   
WRITE: / wa-carrid,
             wa
-connid,
             wa
-countryfr,
             wa
-cityfrom,
             wa
-cityto,
             wa
-fltime,
             wa
-distance.
 
ELSE.
   
EXIT.
 
ENDIF.
ENDDO
.
CLOSE DATASET file.


免責聲明!

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



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