1、***连接FTP站点***
PERFORM SUB_FTP_CONNECT USING P_WA_ZFTPLOGIN
CHANGING L_HANDLE
P_TEXT
P_RETURN.
2、***执行FTP命令***
PERFORM SUB_FTP_PROCESS TABLES P_ITAB_COMMAND
P_ITAB_RESULT
USING L_HANDLE
CHANGING P_TEXT
P_RETURN.
备注:主要参数为 P_ITAB_COMMAND[] 【 CD RT47/YCKQR3 dir hr_yckq*.txt】 P_ITAB_RESULT【
cd rt47/yckqr3
250 CWD command successful.
dir hr_yckq*.txt
200 PORT command successful.
150 Opening BINARY mode data connection for /bin/ls.
05-25-12 03:41PM 93951 hr_yckq_20110431182023_20180525153211.txt
226 Transfer complete.
】
3、***中断FTP站点***
PERFORM SUB_FTP_DISCONNECT CHANGING L_HANDLE.
4、从 P_ITAB_RESULT中取出文件名 包含hr_yckq 但不包含dir的行,可以用 FIND FIRST OCCURRENCE OF C_FILE_PREFIXIN L_WA_FTPFILE-FILENAME RESULTS L_WA_RESULT. 的语句进行实现。
此四步取出ftp中存在的文件的名称,当然我们还得判断文件名称是否存在
4 我们需要将文件取出放到服务器的内存中(不知道是不是内存中啊 为 open dataset 做准备),可以理解为执行完成这个之后 ,会在服务器中创建一个同文件名的数据源
4.1 登录FTP PERFORM SUB_FTP_CONNECT USING P_WA_ZFTPLOGIN
CHANGING P_HANDLE
P_TEXT
P_RETURN.
4.2***执行FTP命令***
PERFORM SUB_FTP_COMMAND TABLES P_ITAB_RESULT
USING P_HANDLE
P_CMD
CHANGING P_RETURN.
注意: 这里的p_CMD 是一个命令 get + 文件名的命令
L_CMD = <FS_FTPFILE>-FILENAME.
SHIFT L_CMD BY 1 PLACES RIGHT.
CONCATENATE 'GET ' L_CMD INTO L_CMD.
4.3 断开ftp
PERFORM SUB_FTP_DISCONNECT CHANGING P_HANDLE.
5.以下就和FTP 本身没什么关系了 ,打开数据源 读取数据源的过程啦
OPEN DATASET P_BK_FILE FOR INPUT IN TEXT MODE ENCODING UTF-8. "打开文件P_BK_FILE为文件名
IF SY-SUBRC = 0. "若成功打开,循环读取文件内容
L_LINE_CNT = 0. "初始行数为0
DO.
CLEAR G_WA_EXTREC.
READ DATASET P_BK_FILE INTO L_FILE_LINE.
L_LINE_CNT = L_LINE_CNT + 1.
IF SY-SUBRC = 0. "成功读取一行数据
SPLIT L_FILE_LINE AT L_SPLIT_TAB INTO G_WA_EXTREC-PERNR
G_WA_EXTREC-BEGDA
G_WA_EXTREC-ENDDA
G_WA_EXTREC-BEGUZ
G_WA_EXTREC-ENDUZ
G_WA_EXTREC-AWART.
APPEND G_WA_EXTREC TO G_ITAB_EXTREC. "存储文件行数据
CLEAR:L_FILE_LINE.
ELSEIF SY-SUBRC = 4. "若读到结尾,则结束读取操作
EXIT.
ELSE. "若读取数据失败,结束读取
P_ERROR_FLAG = C_TURE_X. "打上错误标记,并记录日志
CONCATENATE TEXT-013
P_BK_FILE
'(第' L_LINE_CNT ')行'
INTO L_MSG_STR. "格式为:文件名(第n行)
PERFORM SUB_WRITE_LOG USING L_MSG_STR C_MSGTYP_E.
ENDIF.
ENDDO.
CLOSE DATASET P_BK_FILE. 关掉文件。