在sap里有GUI_DOWNLOAD 函数将sap的数据下载到客户端机器(presentation server),而Dataset则是将数据传输到应用服务器(Application server)。然而在有些时候需要将数据传输到第三方其他系统(3rd Party System),这是我们就可以使用FTP命令来完成数据传输。
1、相关函数HTTP_SCRAMBLEFTP_CONNECTFTP_R3_TO_SERVERFTP_DISCONNECTRFC_CONNECTION_CLOSE
2、函数说明HTTP_SCRAMBLE: 将密码转化为SAP的格式样例代码l_pwd = p_pwd.l_slen = STRLEN( l_pwd ).CALL FUNCTION 'HTTP_SCRAMBLE'exporting source = l_pwd sourcelen = l_slen key = c_keyimporting destination = l_pwd.
FTP_CONNECT : 连接其他系统* To Connect to the Server using FTP样例代码CALL FUNCTION 'FTP_CONNECT'EXPORTING user = p_user password = l_pwd host = p_host rfc_destination = c_dest IMPORTING handle = w_hdlEXCEPTIONS OTHERS = 1.IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
FTP_R3_TO_SERVER: 将SAP的内表数据按字符方式传输到其他系统.样例代码CALL FUNCTION 'FTP_R3_TO_SERVER'EXPORTING handle = w_hdl fname = <file path of destination system> character_mode = 'X'TABLES text = <internal table data>EXCEPTIONS tcpip_error = 1 command_error = 2 data_error = 3OTHERS = 4.IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 RAISING invalid_output_file.ENDIF.
FTP_DISCONNECT: 关闭SAP与其他系统的连接.样例代码* To disconnect the FTPCALL FUNCTION 'FTP_DISCONNECT'EXPORTING handle = w_hdl.
RFC_CONNECTION_CLOSE:关闭SAP与其他系统的RFC连接.样例代码CALL FUNCTION 'RFC_CONNECTION_CLOSE'EXPORTING destination = c_destEXCEPTIONSOTHERS = 1.
3、SAP的样例代码report rsftp004.
parameters: suser(30) type c lower case, spwd(30) type c lower case, shost(64) type c lower case, duser(30) type c lower case, dpwd(30) type c lower case, dhost(64) type c lower case, lines type i default 1000, pasv.selection-screen skip 1.parameters: dest like rfcdes-rfcdest default 'SAPFTP'.
types: begin of text, line(120) type c, end of text.
types: begin of blob, line(80) type x, end of blob.
data: shdl type i, dhdl type i, key type i value 26101957, slen type i, bline(80) type x, sdocid like sysuuid-c, ddocid like sysuuid-c, blob_length type i, cmd(120), error.
data: result type table of text with header line, bindata type table of blob with header line.
* Create data
set extended check off.error = 0.bline = '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F' & '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F' & '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F' & '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F'.
do lines times. bindata-line = bline. append bindata.enddo.
call function 'SYSTEM_UUID_C_CREATE' importing uuid = sdocid.
call function 'SYSTEM_UUID_C_CREATE' importing uuid = ddocid.
* connect to ftp server - source
slen = strlen( spwd ).
call function 'HTTP_SCRAMBLE' exporting source = spwd sourcelen = slen key = key importing destination = spwd.
call function 'SAPGUI_PROGRESS_INDICATOR' exporting text = 'Connect to FTP Server - Source'.
call function 'FTP_CONNECT' exporting user = suser password = spwd host = shost rfc_destination = dest importing handle = shdl.
* connect to ftp server - destination
slen = strlen( dpwd ).
call function 'HTTP_SCRAMBLE' exporting source = dpwd sourcelen = slen key = key importing destination = dpwd.
call function 'SAPGUI_PROGRESS_INDICATOR' exporting text = 'Connect to FTP Server - Destination'.
call function 'FTP_CONNECT' exporting user = duser password = dpwd host = dhost rfc_destination = dest importing handle = dhdl.
if not pasv is initial. refresh result.
call function 'FTP_COMMAND' exporting handle = shdl command = 'set passive on' tables data = result exceptions tcpip_error = 1 command_error = 2 data_error = 3.
if sy-subrc eq 0. write: / 'Set passive mode - Source'. endif.
refresh result.
call function 'FTP_COMMAND' exporting handle = dhdl command = 'set passive on' tables data = result exceptions tcpip_error = 1 command_error = 2 data_error = 3.
if sy-subrc eq 0. write: / 'Set passive mode - Destination'. endif. skip 1.
endif.
* Create file on Source
blob_length = lines * 80.
call function 'SAPGUI_PROGRESS_INDICATOR' exporting text = 'Create File on Source'.
call function 'FTP_R3_TO_SERVER' exporting handle = shdl fname = sdocid blob_length = blob_length tables blob = bindata.
* Copy Files
call function 'SAPGUI_PROGRESS_INDICATOR' exporting text = 'Copy File to Destination'.
refresh result.
call function 'FTP_COPY' exporting handle_source = shdl handle_destination = dhdl file_source = sdocid file_destination = ddocid tables data = result exceptions tcpip_error = 1 command_error = 2 data_error = 3 others = 4.
if sy-subrc ne 0. error = 1. endif.
loop at result. write / result-line.endloop.
* compare content
if error eq 0.
call function 'SAPGUI_PROGRESS_INDICATOR' exporting text = 'Compare Content'.
skip 1. refresh bindata.
call function 'FTP_SERVER_TO_R3' exporting handle = shdl fname = sdocid importing blob_length = blob_length tables blob = bindata.
slen = lines * 80.
if slen ne blob_length. error = 1. write: / 'Length error - expected',slen,'received',blob_length. else. loop at bindata. if bindata-line ne bline. slen = sy-tabix * 80. write: / 'Content error at',slen,bindata-line. error = 1. exit. endif. endloop. endif.
refresh bindata.
call function 'FTP_SERVER_TO_R3' exporting handle = dhdl fname = ddocid importing blob_length = blob_length tables blob = bindata.
slen = lines * 80.
if slen ne blob_length. error = 1. write: / 'Length error - expected',slen,'received',blob_length. else. loop at bindata. if bindata-line ne bline. slen = sy-tabix * 80. write: / 'Content error at',slen,bindata-line. error = 1. exit. endif. endloop. endif.
if error eq 0. write: / 'Content compare OK'. else. write: / 'Content compare error'. endif. skip 1.
endif.
* Delete
concatenate 'del' sdocid into cmd separated by ' '.refresh result.
call function 'SAPGUI_PROGRESS_INDICATOR' exporting text = 'Delete Files'.
call function 'FTP_COMMAND' exporting handle = shdl command = cmd tables data = result exceptions tcpip_error = 1 command_error = 2 data_error = 3.
loop at result. write / result-line.endloop.
concatenate 'del' ddocid into cmd separated by ' '.refresh result.
call function 'FTP_COMMAND' exporting handle = dhdl command = cmd tables data = result exceptions tcpip_error = 1 command_error = 2 data_error = 3.
loop at result. write / result-line.endloop.
* Disconnectcall function 'FTP_DISCONNECT' exporting handle = shdl.call function 'FTP_DISCONNECT' exporting handle = dhdl.
call function 'RFC_CONNECTION_CLOSE' exporting destination = dest exceptions others = 1.
if error ne 0. format color col_negative. write: / 'Error im Test'.else. format color col_positive. write: / ' Test OK'.endif.
* password not visible
at selection-screen output.
loop at screen. if screen-name = 'SPWD' or screen-name = 'DPWD'. screen-invisible = '1'. modify screen. endif. endloop.
