作者:明光爍亮
出處: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(30) TYPE c VALUE 'admin', "用戶名
l_pwd(30) TYPE c VALUE 'Aa123456', "密碼
l_host(64) TYPE c VALUE '192.168.0.3', "FTP服務器地址
l_path(64) TYPE c VALUE '/HYS', "路徑
l_rc(1),
l_dest TYPE rfcdes-rfcdest VALUE 'SAPFTPA'. "前端:sapftp 后台運行:sapftpa.
DATA: l_handle TYPE i,
l_command(255) TYPE c,
l_result TYPE TABLE OF txmisporow,
l_filename(50) TYPE c,
l_pwdlength TYPE i,
l_length TYPE i,
l_ftppwd(255) TYPE c,
l_key TYPE i 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.
DATA: BEGIN 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