一、基础知识
1.操作FTP,需要用户具有权限,如下图:
2. SAPFTP_SERVERS维护FTP服务器地址
3.SAP连接FTP标准示例程序:
RSFTP001 SAPFTP 版本
RSFTP002 执行 FTP 命令
RSFTP003 FTP 放置/获取测试
RSFTP004 FTP 复制
RSFTP005 SAPFTP 检查
注意:RSFTP005可自动创建两个名为SAPFTP和SAPFTPA的TCP/IP的RFC链接
RSFTP006 FTP 命令列表
RSFTP007 测试 FB:FTP_SERVER_TO_R3 / FTP_R3_TO_SERVER
RSFTP008 测试 FB:FTP_CLIENT_TO_R3 / FTP_R3_TO_CLIENT
RSFTP009 通过验证测试 FTP 放置
RSFTP011 FTP 复制
RSFTP012 拆分 SAPFTP_SERVERS 中的主机名和端
4.常用的函数(Function Module)
FTP_CONNECT 链接FTP
注意:FTP_CONNECT的Destination的两个参数区别
SAPFTP 用于SAP客户端前端执行(把FTP服务器的文件下载到本地电脑路径,或者上传本地文件)
SAPFTPA 用于SAP服务器端执行(把FTP服务器的文件放到SAP服务器路径)
FTP_COMMAND 执行FTP命令
FTP_DISCONNECT 断开FTP
FTP_R3_TO_SERVER 将R3数据写入FTP
FTP_SERVER_TO_R3 读取FTP数据到R3(*.txt,*.dat,*.csv)
注意:中文乱码问题
把内表数据用函数SCMS_TEXT_TO_BINARY转换成2进制
把读取FTP数据用函数SCMS_BINARY_TO_TEXT转换
这两种情况需要FTP_SERVER_TO_R3/FTP_R3_TO_SERVER使用BLOB和BLOB_LENGTH
FTP_R3_TO_CLIENT 客户端数据写入FTP
FTP_CLIENT_TO_R3 读取FTP数据到客户端
二、案例程序(自己搭建的一个本地FTP进行的测试,不会搭建自行百度)
选择屏:
功能:
1、上传文件
1).获取上传文件
2).查看上传结果
3).代码
"获取文件夹路径,文件名,文件全路径
PERFORM frm_get_uppath CHANGING ls_up_path ls_up_file ls_up_fname.
"指定本地文件路径
CONCATENATE 'lcd' ls_up_path INTO gt_ftp_com SEPARATED BY space.
APPEND gt_ftp_com.
"指定本地文件文件名
CONCATENATE 'put' ls_up_fname INTO gt_ftp_com SEPARATED BY space.
APPEND gt_ftp_com.
"执行FTP指令
PERFORM frm_execute_handle TABLES gt_ftp_com.
*&---------------------------------------------------------------------*
*& Form frm_get_uppath
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LS_UP_PATH
*&---------------------------------------------------------------------*
FORM frm_get_uppath CHANGING ps_up_path
ps_up_file
ps_up_fname.
DATA: abap_encoding TYPE abap_encoding VALUE 'UTF-8'.
DATA: ls_up_path TYPE string,
ls_up_file TYPE string,
ls_up_fname TYPE string.
DATA:lv_ucomm TYPE sy-ucomm.
CLEAR: lv_ucomm,ls_up_path,ls_up_file,ls_up_fname.
"获取文件全路径,文件名,文件夹路径
CALL FUNCTION 'GUI_FILE_LOAD_DIALOG'
EXPORTING
window_title = '打开文件'
with_encoding = abap_true
IMPORTING
path = ls_up_path "文件夹路径
filename = ls_up_fname "文件名
fullpath = ls_up_file "文件全路径
file_encoding = abap_encoding.
lv_ucomm = sy-ucomm.
IF lv_ucomm EQ 'LOAD'.
ps_up_file = ls_up_file.
ps_up_fname = ls_up_fname.
ps_up_path = ls_up_path.
ELSE.
"断开FTP,RFC链接
PERFORM frm_ftp_disconnect.
MESSAGE e001(00) WITH '取消获取文件操作'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_execute_uploda
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_execute_handle TABLES pt_ftp_path STRUCTURE gt_ftp_com.
DATA:BEGIN OF lt_rs_data OCCURS 0,
line(100) TYPE c,
END OF lt_rs_data.
CLEAR:lt_rs_data.
FREE:lt_rs_data.
LOOP AT pt_ftp_path FROM 1.
"执行FTP指令
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = pt_ftp_path-cmd
compress = gc_compress
TABLES
data = lt_rs_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
PERFORM frm_ftp_disconnect.
MESSAGE e001(00) WITH '操作执行失败!'.
EXIT.
ELSE.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 100 "进度
text = '操作执行成功!'. "显示文本
MESSAGE s001(00) WITH '操作执行成功!'.
ENDIF.
ENDLOOP.
ENDFORM.
2、下载文件:
1).获取下载地址
2).获取FTP文件目录,进行选择下载
3).文件是否存在校验
4).下载结果查看
5.代码
"获取下载路径
PERFORM frm_get_dwpath CHANGING ls_dw_path.
"获取FTP文件名
PERFORM frm_get_fname CHANGING ls_dw_fname.
"检查文件是否存在
PERFORM frm_check_dw USING ls_dw_path ls_dw_fname.
"指定本地文件路径
CONCATENATE 'lcd' ls_dw_path INTO gt_ftp_com SEPARATED BY space.
APPEND gt_ftp_com.
"指定获取文件名
CONCATENATE 'get' ls_dw_fname INTO gt_ftp_com SEPARATED BY space.
APPEND gt_ftp_com.
"执行FTP指令
PERFORM frm_execute_handle TABLES gt_ftp_com.
*&---------------------------------------------------------------------*
*& Form frm_get_dwpath
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LS_DW_PATH
*&---------------------------------------------------------------------*
FORM frm_get_dwpath CHANGING ps_dw_path.
DATA: ls_dw_path TYPE string.
CLEAR: