sap 与FTP 发送文件的例子 转载

 
1.首先确定是否与FTP 能进行连接。(注意这里是sap 是否能进行连接)
方法: 用se38 先用 RSFTP002程序输入用户名,密码 和 host :ip地址 进行测试。
网上说明很多,但是没有写详细。command1 - 到 command3 先输入 command1 一个查询目录命令。
(别说不会,那就先查查ftp命令。)
返回的结果就知道是否连接成功。
1.5 为啥 是1.5 不是2 ? 如果不同就sm59 设置一下sapftp 或者自建一个zsapftp 。
 
 
2.连接成功就开始编写代码。可参考 上面的 RSFTP002 程序。
如果不会参考就算了,你不适合继续写这个程序了。
记住几个关键的函数(如下)。
1.call function 'HTTP_SCRAMBLE' "获取加密密码
exporting
source = ftp_pwd
sourcelen = dstlen
key = key "26101957 不能改
importing
destination = ftp_pwd.
2.call function 'FTP_CONNECT' "连接ftp服务器
exporting
user = ftp_user
password = ftp_pwd
host = ftp_host
rfc_destination = dest
importing
handle = hdl_1 "连接的句柄
exceptions
not_connected = 1
others = 2.
3. call function 'FTP_COMMAND' "执行FTP命令
exporting
handle = p_hdl_1 "连接句柄
command = l_ftpcommand "命令
tables
data = ftp_result "返回信息
exceptions
tcpip_error = 1
command_error = 2
data_error = 3
others = 4.
4. call function 'FTP_SERVER_TO_R3' "拷贝ftp服务器文件到r3
exporting
handle = hdl_1
fname = dest_filename
character_mode = 'X'
tables
text = itab_file.
5. call function 'FTP_COPY' "拷贝文件到指定位置
exporting
handle_source = hdl_1
handle_destination = hdl_2
file_source = dest_filename
file_destination = dest_filename
tables
data = ftp_result
exceptions
others = 1.
 
 
call function 'SCMS_TEXT_TO_BINARY'
importing
output_length = blob_length
tables
text_tab = itab_file
binary_tab = bindata
exceptions
failed = 1
others = 2.
PERFORM FRM_SET_INFORMATION_FOR_FTP.
*...连接到目标FTP 。
PERFORM FRM_CONNECT_FTP.
*..切换FTP 目录 到设备根目录
PERFORM FRM_SET_ROOT_DIRECTORY USING CNS_ROOT G_HANDLE
G_FTPCOMMAND G_FTPRETN.
*..创建批号文件夹 (日期+设备号+版本号)
PERFORM FRM_CREAT_BATCH_DIRECTORY USING P_EQUNR G_VERSION
G_FTPCOMMAND G_FTPRETN.
*..进入创建的目录 G_FTPDIR = ROOT+文件夹+'/'
PERFORM FRM_CHANGE_TO_BATDIRECTORY USING G_NEW_DIR G_ROOTDIR
G_FTPCOMMAND G_FTPRETN.
*..复制文件
PERFORM FRM_COPY_TO_FTP_SEVER USING P_EQUNR.
*..删除 flag0 文件,并上传flag1 文件。标识上传完成。
*...传输文件。
PERFORM FRM_UPDATE_FLAG_FILE USING G_NEW_DIR G_ROOTDIR
G_FTPCOMMAND G_FTPRETN.
*...断开连接
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
HANDLE = G_HANDLE.
 
 
FORM FRM_SET_INFORMATION_FOR_FTP.
IF **** 根据条件选择不同信息。
G_HOST = '***.**.88.**'.
* G_DEST = 'SAPFTP'. " 这个是根据设置里创建的连接来的,默认是SAPFTP
G_DEST = 'ZSAPFTP'.
G_USER = '**'. "FTP 连接用户名
G_PW = '***'. "密码
DESCRIBE FIELD G_PW LENGTH G_DSTLEN.
* ENDIF.
CALL 'AB_RFC_X_SCRAMBLE_STRING'
ID 'SOURCE' FIELD G_PW
ID 'KEY' FIELD CNS_KEY
ID 'SCR' FIELD 'X'
ID 'DESTINATION' FIELD G_PW
ID 'DSTLEN' FIELD G_DSTLEN.
*....此函数不写也能连上。4.6C 回报错。只好注释掉。
* CALL FUNCTION 'HTTP_SCRAMBLE'
* EXPORTING
* SOURCE = G_PW
* SOURCELEN = 9
* KEY = CNS_KEY
* IMPORTING
* DESTINATION = G_PW.
ENDFORM. " SET_INFORMATION_FOR_FTP
 
 
FORM FRM_CONNECT_FTP.
DO 3 TIMES." 连接三次,因为一次有可能会不成功
* OPEN THE FTP SERVER.
CALL FUNCTION 'FTP_CONNECT'
EXPORTING
USER = G_USER
PASSWORD = G_PW
HOST = G_HOST
RFC_DESTINATION = G_DEST
IMPORTING
HANDLE = G_HANDLE
EXCEPTIONS
NOT_CONNECTED = 1
OTHERS = 2.
IF SY-SUBRC = 0.
EXIT.
ENDIF.
ENDDO.
IF SY-SUBRC <> 0.
*...连接失败删除已下载文件。
LOOP AT GT_DIREC INTO GS_DIREC.
*.....这里删除的是本地文件。还是附上代码是删除本级文件的form
*......例子是下载再传FTP,所以需要下载成本地文件
PERFORM FRM_DELET_FILES USING GS_DIREC-DIREC.
ENDLOOP.
REFRESH: GT_DIREC.
MESSAGE S000(0K) WITH '连接FTP服务器失败!请重试!'.
STOP.
ENDIF.
ENDFORM. " FRM_CONNECT_FTP
FORM FRM_DELET_FILES USING P_DIRECTORY.
DATA: L_RC TYPE I.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
EXPORTING
FILENAME = P_DIRECTORY
CHANGING
RC = L_RC
EXCEPTIONS
FILE_DELETE_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
FILE_NOT_FOUND = 4
ACCESS_DENIED = 5
UNKNOWN_ERROR = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " FRM_DELET_FILES
 
 
FORM FRM_SET_ROOT_DIRECTORY USING P_ROOT
P_HANDLE
P_COMMAND
P_RETURN.
CLEAR: P_COMMAND.
CONCATENATE 'cd' P_ROOT INTO P_COMMAND SEPARATED BY SPACE.
PERFORM FRM_FTP_COMMAND USING P_COMMAND P_RETURN.
IF P_RETURN = 0.
G_ROOTDIR = P_ROOT.
ELSE.
CLEAR: G_ROOTDIR.
ENDIF.
ENDFORM. " FRM_SET_ROOT_DIRECTORY
FORM FRM_CREAT_BATCH_DIRECTORY USING P_EQUNR
P_VERSION
P_COMMAND
P_RETURN.
DATA: L_DIRNAME TYPE STRING.
CONCATENATE SY-DATUM P_EQUNR P_VERSION INTO L_DIRNAME.
CLEAR: P_COMMAND.
CONCATENATE 'mkdir' L_DIRNAME INTO P_COMMAND SEPARATED BY SPACE.
PERFORM FRM_FTP_COMMAND USING P_COMMAND P_RETURN.
IF P_RETURN = 0.
CONCATENATE G_ROOTDIR L_DIRNAME '/' INTO G_FTPDIR.
G_NEW_DIR = L_DIRNAME.
ELSE.
CLEAR: G_FTPDIR.
ENDIF.
ENDFORM. " FRM_CREAT_BATCH_DIRECTORY
FORM FRM_CHANGE_TO_BATDIRECTORY USING P_DIRECT
P_DIR
P_COMMAND
P_RETURN.
CLEAR: P_COMMAND.
CONCATENATE 'cd' P_DIRECT INTO P_COMMAND SEPARATED BY SPACE.
PERFORM FRM_FTP_COMMAND USING P_COMMAND P_RETURN.
IF P_RETURN = 0.
CONCATENATE P_DIR P_DIRECT '/' INTO G_FTPDIR.
ELSE.
CLEAR: G_FTPDIR.
ENDIF.
ENDFORM. " FRM_CHANGE_TO_BATDIRECTORY
*..创建文件内容目录。
PERFORM FRM_CREATE_DIR_AND_ENTER USING G_FTPDIR
G_FTPCOMMAND G_FTPRETN.
PERFORM PROGRASS_BAR USING '文件复制中' '90'.
DATA: L_NAME TYPE STRING .
LOOP AT GT_DIREC INTO GS_DIREC.
CLEAR: L_NAME.
CONCATENATE GS_DIREC-FILEN GS_DIREC-VERSN GS_DIREC-FLTYP
INTO L_NAME.
PERFORM FRM_COPY_FILE USING GS_DIREC-DIREC L_NAME.
ENDLOOP.
FORM FRM_COPY_FILE USING P_SOURCE
P_DESTNAME.
DATA: LT_BINDATA TYPE TABLE OF BLOB WITH HEADER LINE.
DATA: BEGIN OF LT_FILE OCCURS 0,
LINE(512),
END OF LT_FILE.
DATA: L_SOURCE(30) TYPE C.
DATA: L_BLOB_LEN TYPE I.
L_SOURCE = P_SOURCE.
CALL FUNCTION 'SCMS_UPLOAD'
EXPORTING
FILENAME = L_SOURCE
BINARY = 'X'
IMPORTING
FILESIZE = L_BLOB_LEN
TABLES
DATA = LT_BINDATA
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
DATA: L_DEST_NAME TYPE RLGRAP-FILENAME .
L_DEST_NAME = P_DESTNAME.
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
HANDLE = G_HANDLE
FNAME = L_DEST_NAME
BLOB_LENGTH = L_BLOB_LEN
TABLES
* text = itab.
BLOB = LT_BINDATA.
ENDFORM. " FRM_COPY_FILE
 
 
后续继续补上代码。有不明白的地方,可以一起探讨。

你可能感兴趣的:(sap 与FTP 发送文件的例子 转载)