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
后续继续补上代码。有不明白的地方,可以一起探讨。