SAP ABAP: 把內表數據以excel或csv格式,通過前台或者后台的方式上傳至FTP服務器


作者:明光爍亮
出處:http://www.cnblogs.com/hezhongxun/
微信號:HEme922 歡迎加好友一起交流SAP! 視頻資料共享。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 

需求:今天接到一個FTP的工作,就是每天晚上把當天某個報表的數據自動保存excel上傳到FTP服務器。

SAP已經有現成的FTP函數使用,可以通過函數的方式來實現,實現前先准備一些數據:

User:登錄FTP的用戶名

Password:登錄FTP的密碼

Host:FTP 的IP地址

Path: FTP的文件存放路徑

RFC_Destination:意思是在前台還是后台的方式運行。前台:SAPFTP   后台:SAPFTPA

Command:操作FTP的命令,這里使用  ' CD /Path  '  打開文件夾

Filename:文件名 

先在本地試下能不能連接FTP服務器

  

下面簡單說明下FTP常用的函數

HTTP_SCRAMBLE:用戶名密碼加密

FTP_CONNECT:創建FTP服務器連接

FTP_COMMAND:執行FTP命令

FTP_R3_TO_SERVER:在SAP端發送數據到FTP 服務器

FTP_DISCONNECT:關閉FTP連接

RFC_CONNECTION_CLOSE:關閉RFC連接

 

SAP提供的函數組是SFTP,系統提供的函數挺多,可以去研究下,我這里只用到上面的函數。

 

接下來就是怎么把內表的數據轉換成可以上傳的格式,這里就是把內表轉換成二進制,有以下方法可以使用:

SAP_CONVERT_TO_CSV_FORMAT
SAP_CONVERT_TO_TXT_FORMAT
SAP_CONVERT_TO_TEX_FORMAT
SAP_CONVERT_TO_XLS_FORMAT
SAP_CONVERT_TO_XML_FORMAT

SCMS_TEXT_TO_BINARY

我用到的方法只是前兩個和最后一個,第四個只能直接導出文件,可能還沒有找到合適的方法,以后再做彌補。

下面就是上代碼了

DATA: l_user(30TYPE VALUE 'admin'"用戶名
      l_pwd(30)  TYPE VALUE 'Aa123456',      "密碼
      l_host(64TYPE VALUE '192.168.0.3',   "FTP服務器地址
      l_path(64TYPE VALUE '/HYS',       "路徑
      l_rc(1),
      l_dest     TYPE rfcdes-rfcdest VALUE 'SAPFTPA'"前端:sapftp   后台運行:sapftpa.

DATA: l_handle       TYPE i,
      l_command(255TYPE c,
      l_result       TYPE TABLE OF txmisporow,
      l_filename(50TYPE c,
      l_pwdlength    TYPE i,
      l_length       TYPE i,
      l_ftppwd(255)  TYPE c,
      l_key          TYPE VALUE 26101957,
      l_encoding     TYPE abap_encoding VALUE '8400'.


DATA: lt_text TYPE truxs_t_text_data.

DATA: l_binary_tab LIKE TABLE OF solix.

DATABEGIN OF ls_tab,
        tline(4096),
      END OF ls_tab.
DATA: lt_tab LIKE TABLE OF ls_tab.

l_pwdlength strlen( l_pwd ).


*****************開始FTP傳輸數據**********
  CALL FUNCTION 'HTTP_SCRAMBLE' “密碼加密
    EXPORTING
      source      = l_pwd
      sourcelen   = l_pwdlength
      key         = l_key
    IMPORTING
      destination = l_ftppwd.

  "創建FTP連接

  CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
      user            = l_user
      password        = l_ftppwd
      host            = l_host
      rfc_destination = l_dest
    IMPORTING
      handle          = l_handle
    EXCEPTIONS
      not_connected   1
      OTHERS          2.

  IF sy-subrc <> 0.
    MESSAGE 'FTP path error' TYPE 'E'.
  ENDIF.

l_rc = COND #WHEN l_path+(1'/' THEN ' ' ELSE ' /' ).
  CONCATENATE 'cd' l_path INTO l_command SEPARATED BY l_rc. "拼接FTP命令,這里是打開文件夾地址

  CALL FUNCTION 'FTP_COMMAND' ”執行FTP命令
    EXPORTING
      handle        = l_handle
      command       = l_command
    TABLES
      data          = l_result
    EXCEPTIONS
      tcpip_error   1
      command_error 2
      data_error    3
      OTHERS        4.

  IF sy-subrc <> 0.
    PERFORM ftp_disconnect USING l_handle l_dest.
    MESSAGE 'FTP path error' TYPE 'E'.
  ENDIF.

  CONCATENATE 'solist' sy-datum  '.csv' INTO l_filename.
"內表數據轉換成CSV或者excel格式
 CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT' 
    TABLES
      i_tab_sap_data       = <dyn_table>
    CHANGING
      i_tab_converted_data = lt_text
    EXCEPTIONS
      conversion_failed    1
      OTHERS               2.

  LOOP AT lt_text ASSIGNING FIELD-SYMBOL(<text>). “把數據存到一個單列的內表,等一下用作轉換二進制用
    APPEND VALUE #( tline = <text> TO lt_tab.
  ENDLOOP.

CALL FUNCTION 'SCMS_TEXT_TO_BINARY' ”轉換成二進制文件
    EXPORTING
      encoding      = l_encoding
    IMPORTING
      output_length = l_length
    TABLES
      text_tab      = lt_tab
      binary_tab    = l_binary_tab
    EXCEPTIONS
      failed        1
      OTHERS        2.

“剛剛已經用FTP命令打開的文件夾,現在可以直接把二進制文件傳至服務器了。
CALL FUNCTION 'FTP_R3_TO_SERVER'
    EXPORTING
      handle         = l_handle
      fname          = l_filename
      blob_length    = l_length
      character_mode ' '
    TABLES
      blob           = l_binary_tab
    EXCEPTIONS
      tcpip_error    1
      command_error  2
      data_error     3
      OTHERS         4.

  CASE sy-subrc.
    WHEN 0.
      MESSAGE 'Upload FTP Success' TYPE 'S'.
    WHEN 1.
      MESSAGE 'Upload FTP Failure (Tcpip_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
    WHEN 2.
      MESSAGE 'Upload FTP Failure (Command_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
    WHEN 3.
      MESSAGE 'Upload FTP Failure (Data_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
    WHEN OTHERS.
      MESSAGE 'Upload FTP Failure (Other)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
  ENDCASE.

”關閉FTP 連接
CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      handle = p_handle.

  CALL FUNCTION 'RFC_CONNECTION_CLOSE'
    EXPORTING
      destination          = p_dest
    EXCEPTIONS
      destination_not_open 1
      OTHERS               2.

現在就可以試下通過后台跑程序了,先運行程序,然后設置后台立即執行 ,保存后程序將在后台運行。

 

 

最后到SM37查看程序運行情況,還有打開FTP服務器查看文件

 

 SM37提示FTP運行正常,文件也保存到了,所以程序執行沒問題。

注意運行后台任務時,文件名必須沒有中文,我剛開始就用了中文,后台一直報錯,后來改了文件名才運行正常。

 


免責聲明!

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



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