一、基础知识
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:ls_dw_path.
"获取下载路径
CALL METHOD cl_gui_frontend_services=>directory_browse
EXPORTING
window_title = '选择下载路径'
CHANGING
selected_folder = ls_dw_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF ls_dw_path IS NOT INITIAL.
ps_dw_path = ls_dw_path.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 40 "进度
text = '获取下载路径成功!'. "显示文本
ELSE.
"断开FTP,RFC链接
PERFORM frm_ftp_disconnect.
MESSAGE e001(00) WITH '取消获取下载路径操作'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_fname
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_fname CHANGING ps_dw_fname.
DATA:BEGIN OF lt_ftp_com OCCURS 0,
cmd(100) TYPE c,
END OF lt_ftp_com.
DATA:BEGIN OF lt_rs_data OCCURS 0,
line(100) TYPE c,
END OF lt_rs_data.
DATA:BEGIN OF lt_set_alv OCCURS 0,
path(100) TYPE c,
name(100) TYPE c,
END OF lt_set_alv.
DATA:lv_lin TYPE i,
lv_str_path TYPE i,
lv_str_line TYPE i.
"弹窗选择
DATA:lo_alv TYPE REF TO cl_salv_table.
DATA:lo_functions TYPE REF TO cl_salv_functions_list,
lo_selections TYPE REF TO cl_salv_selections,
lo_layout TYPE REF TO cl_salv_layout,
lo_display TYPE REF TO cl_salv_display_settings.
DATA:lr_columns TYPE REF TO cl_salv_columns_table.
DATA:lr_column TYPE REF TO cl_salv_column_table.
DATA lt_rows TYPE salv_t_row.
DATA:ls_row TYPE LINE OF salv_t_row.
CLEAR:lt_ftp_com,lt_rs_data,lt_set_alv,lv_lin,lv_str_path.
FREE:lt_ftp_com,lt_rs_data,lt_set_alv.
"FTP指令获取FTP文件目录
CONCATENATE 'nlist' p_fpath INTO lt_ftp_com SEPARATED BY space.
APPEND lt_ftp_com.
"执行FTP指令
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = lt_ftp_com-cmd
compress = gc_compress
TABLES
data = lt_rs_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
lv_lin = lines( lt_rs_data ). "内表行数
lv_str_path = strlen( p_fpath ). "FTP地址长度
LOOP AT lt_rs_data.
"排除非目录文件结果
IF sy-tabix LE 3 OR sy-tabix EQ lv_lin .
CONTINUE.
ELSE.
CLEAR:lv_str_line.
"拆分路径和文件名
lv_str_line = strlen( lt_rs_data-line ).
lt_set_alv-path = lt_rs_data+0(lv_str_path).
lt_set_alv-name = lt_rs_data+lv_str_path(lv_str_line).
APPEND lt_set_alv.
ENDIF.
ENDLOOP.
"实现弹窗选择FTP文件
IF lt_set_alv[] IS NOT INITIAL.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = lt_set_alv[] ).
CATCH cx_salv_msg.
ENDTRY.
lo_functions = lo_alv->get_functions( ).
lo_functions->set_all( 'X' )."设置默认按键
lo_selections = lo_alv->get_selections( ).
lo_selections->set_selection_mode( if_salv_c_selection_mode=>single )."设置选择模式
lo_display = lo_alv->get_display_settings( ).
lo_display->set_striped_pattern( cl_salv_display_settings=>true ).
lo_display->set_list_header( '选择需下载的FTP文件' ).
lo_display->set_fit_column_to_table_size( 'X' )."列自适应
TRY.
lr_columns = lo_alv->get_columns( ).
lr_columns->set_optimize( 'X' ).
lr_column ?= lr_columns->get_column( 'PATH' )."需处理的列
lr_column->set_long_text( 'FTP路径' ).
lr_column->set_medium_text( 'FTP路径' ).
lr_column->set_short_text( 'FTP路径' ).
lr_column ?= lr_columns->get_column( 'NAME' )."需处理的列
lr_column->set_long_text( '文件名称' ).
lr_column->set_medium_text( '文件名称' ).
lr_column->set_short_text( '文件名称' ).
CATCH cx_salv_not_found.
ENDTRY.
IF lo_alv IS BOUND.
lo_alv->set_screen_popup(
start_column = 10
end_column = 110
start_line = 5
end_line = 15 ).
lo_alv->display( ). "调用显示方法
ENDIF.
ENDIF.
"获取选择值
REFRESH:lt_rows.
lt_rows = lo_selections->get_selected_rows( ).
IF lt_rows[] IS NOT INITIAL.
LOOP AT lt_rows INTO ls_row.
READ TABLE lt_set_alv INDEX ls_row.
ps_dw_fname = lt_set_alv-name.
CLEAR:ls_row.
ENDLOOP.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 60 "进度
text = '获取FTP需下载文件成功!'. "显示文本
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_dw
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_DW_PATH
*& --> LS_DW_FNAME
*&---------------------------------------------------------------------*
FORM frm_check_dw USING ps_dw_path
ps_dw_fname.
DATA:lv_file TYPE string.
DATA:lv_result TYPE abap_bool.
DATA:lv_rc TYPE sy-subrc.
DATA:lv_answer TYPE c LENGTH 1.
"检查下载路径文件是否已经存在
CONCATENATE ps_dw_path ps_dw_fname INTO lv_file SEPARATED BY '\'.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_file
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF lv_result EQ 'X'.
"文件重复处理
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
defaultoption = 'Y'
textline1 = '文件检查:'
textline2 = '下载路径文件已存在,是否覆盖文件?'
titel = '消息确认'
start_column = 25
start_row = 6
cancel_display = 'X'
IMPORTING
answer = lv_answer. "返回值J:yes;N:no;A:cancel
IF lv_answer EQ 'J'.
"删除文件
CALL METHOD cl_gui_frontend_services=>file_delete
EXPORTING
filename = lv_file
CHANGING
rc = lv_rc
EXCEPTIONS
file_delete_failed = 1
cntl_error = 2
error_no_gui = 3
file_not_found = 4
access_denied = 5
unknown_error = 6
not_supported_by_gui = 7
wrong_parameter = 8
OTHERS = 9.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 80 "进度
text = '删除文件成功!'. "显示文本
* MESSAGE s001(00) WITH '删除文件成功!'.
ENDIF.
ENDIF.
ELSE.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 80 "进度
text = '文件重复性检查成功!'. "显示文本
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.
3、读取文件:
需要对应的结构进行接收,结构如下:
1).选择文件
2).读取文件结果展示(没写展示的代码,图为DEBUG截取)
注意:FTP_SERVER_TO_R3读取文件,文件类型为.txt,.csv,.dat其余类型无法读取
FTP_SERVER_TO_R3读取结果展示:
Excel类型文件可以先下载到本地再进行读取
Excel读取结果展示:
选择下载路径(可以默认地址,此步骤可以省略,制造没有下载步骤的假象)
下载文件是否存在检查(可以不用检查直接覆盖,或者文件名增加时间戳)
读取结构展示:
3).代码
"获取FTP文件名
PERFORM frm_get_fname CHANGING ls_dw_fname.
* "复制FTP文件到R3
* PERFORM frm_copy_file USING ls_dw_fname.
"读取FTP文件
PERFORM frm_read_file USING ls_dw_fname.
*&---------------------------------------------------------------------*
*& Form frm_get_fname
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_fname CHANGING ps_dw_fname.
DATA:BEGIN OF lt_ftp_com OCCURS 0,
cmd(100) TYPE c,
END OF lt_ftp_com.
DATA:BEGIN OF lt_rs_data OCCURS 0,
line(100) TYPE c,
END OF lt_rs_data.
DATA:BEGIN OF lt_set_alv OCCURS 0,
path(100) TYPE c,
name(100) TYPE c,
END OF lt_set_alv.
DATA:lv_lin TYPE i,
lv_str_path TYPE i,
lv_str_line TYPE i.
"弹窗选择
DATA:lo_alv TYPE REF TO cl_salv_table.
DATA:lo_functions TYPE REF TO cl_salv_functions_list,
lo_selections TYPE REF TO cl_salv_selections,
lo_layout TYPE REF TO cl_salv_layout,
lo_display TYPE REF TO cl_salv_display_settings.
DATA:lr_columns TYPE REF TO cl_salv_columns_table.
DATA:lr_column TYPE REF TO cl_salv_column_table.
DATA lt_rows TYPE salv_t_row.
DATA:ls_row TYPE LINE OF salv_t_row.
CLEAR:lt_ftp_com,lt_rs_data,lt_set_alv,lv_lin,lv_str_path.
FREE:lt_ftp_com,lt_rs_data,lt_set_alv.
"FTP指令获取FTP文件目录
CONCATENATE 'nlist' p_fpath INTO lt_ftp_com SEPARATED BY space.
APPEND lt_ftp_com.
"执行FTP指令
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = lt_ftp_com-cmd
compress = gc_compress
TABLES
data = lt_rs_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
lv_lin = lines( lt_rs_data ). "内表行数
lv_str_path = strlen( p_fpath ). "FTP地址长度
LOOP AT lt_rs_data.
"排除非目录文件结果
IF sy-tabix LE 3 OR sy-tabix EQ lv_lin .
CONTINUE.
ELSE.
CLEAR:lv_str_line.
"拆分路径和文件名
lv_str_line = strlen( lt_rs_data-line ).
lt_set_alv-path = lt_rs_data+0(lv_str_path).
lt_set_alv-name = lt_rs_data+lv_str_path(lv_str_line).
APPEND lt_set_alv.
ENDIF.
ENDLOOP.
"实现弹窗选择FTP文件
IF lt_set_alv[] IS NOT INITIAL.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = lt_set_alv[] ).
CATCH cx_salv_msg.
ENDTRY.
lo_functions = lo_alv->get_functions( ).
lo_functions->set_all( 'X' )."设置默认按键
lo_selections = lo_alv->get_selections( ).
lo_selections->set_selection_mode( if_salv_c_selection_mode=>single )."设置选择模式
lo_display = lo_alv->get_display_settings( ).
lo_display->set_striped_pattern( cl_salv_display_settings=>true ).
lo_display->set_list_header( '选择需下载的FTP文件' ).
lo_display->set_fit_column_to_table_size( 'X' )."列自适应
TRY.
lr_columns = lo_alv->get_columns( ).
lr_columns->set_optimize( 'X' ).
lr_column ?= lr_columns->get_column( 'PATH' )."需处理的列
lr_column->set_long_text( 'FTP路径' ).
lr_column->set_medium_text( 'FTP路径' ).
lr_column->set_short_text( 'FTP路径' ).
lr_column ?= lr_columns->get_column( 'NAME' )."需处理的列
lr_column->set_long_text( '文件名称' ).
lr_column->set_medium_text( '文件名称' ).
lr_column->set_short_text( '文件名称' ).
CATCH cx_salv_not_found.
ENDTRY.
IF lo_alv IS BOUND.
lo_alv->set_screen_popup(
start_column = 10
end_column = 110
start_line = 5
end_line = 15 ).
lo_alv->display( ). "调用显示方法
ENDIF.
ENDIF.
"获取选择值
REFRESH:lt_rows.
lt_rows = lo_selections->get_selected_rows( ).
IF lt_rows[] IS NOT INITIAL.
LOOP AT lt_rows INTO ls_row.
READ TABLE lt_set_alv INDEX ls_row.
ps_dw_fname = lt_set_alv-name.
CLEAR:ls_row.
ENDLOOP.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 60 "进度
text = '获取FTP需下载文件成功!'. "显示文本
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_read_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_read_file USING ps_dw_fname.
DATA:lv_name TYPE c LENGTH 50,
lv_type TYPE c LENGTH 10,
lv_point TYPE c LENGTH 1 VALUE '.',
lv_point_1 TYPE c LENGTH 1 VALUE '\'.
DATA:ls_dw_path TYPE c LENGTH 200,
lv_dw_file TYPE c LENGTH 200.
CLEAR: lv_name,lv_type,ls_dw_path,lv_dw_file.
SPLIT ps_dw_fname AT lv_point INTO lv_name lv_type.
CASE lv_type.
WHEN 'csv' OR 'CSV' OR 'txt' OR 'TXT' OR 'dat' OR 'DAT'.
"直接读取
PERFORM frm_read_file_01 USING ps_dw_fname.
WHEN OTHERS.
"获取文件下载路径
PERFORM frm_get_dwpath CHANGING ls_dw_path.
"检查文件是否存在
PERFORM frm_check_dw USING ls_dw_path ps_dw_fname.
CONCATENATE 'lcd' ls_dw_path INTO gt_ftp_com SEPARATED BY space.
APPEND gt_ftp_com.
CONCATENATE 'get' ps_dw_fname INTO gt_ftp_com SEPARATED BY space.
APPEND gt_ftp_com.
PERFORM frm_execute_handle TABLES gt_ftp_com.
CONCATENATE ls_dw_path ps_dw_fname INTO lv_dw_file SEPARATED BY lv_point_1.
PERFORM frm_read_file_02 USING lv_dw_file.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_read_file_01
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_read_file_01 USING ps_dw_fname.
DATA:BEGIN OF lt_rs_data OCCURS 0,
line(100) TYPE c,
END OF lt_rs_data.
DATA: BEGIN OF ls_line,
line(2000),
END OF ls_line,
lt_line LIKE TABLE OF ls_line.
DATA:lt_bintab TYPE w3mimetabtype,
lv_blen TYPE i.
DATA: lt_flight_t TYPE TABLE OF zssflight_ftp.
DATA: lt_text TYPE truxs_t_text_data,
ls_text LIKE LINE OF lt_text.
READ TABLE gt_ftp_com INDEX 1.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = gt_ftp_com-cmd
compress = gc_compress
TABLES
data = lt_rs_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc NE 0.
MESSAGE e001(00) WITH '进入FTP路径失败'.
ENDIF.
CALL FUNCTION 'FTP_SERVER_TO_R3'
EXPORTING
handle = gv_handle
fname = ps_dw_fname
* character_mode = 'X'
IMPORTING
blob_length = lv_blen
TABLES
blob = lt_bintab
* text = lt_line
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_TEXT'
EXPORTING
input_length = lv_blen
* ENCODING = '4110' "4110:UTF8,8400:GB2312
IMPORTING
output_length = lv_blen
TABLES
binary_tab = lt_bintab
text_tab = lt_line
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT lt_line INTO ls_line.
ls_text = ls_line.
APPEND ls_text TO lt_text.
ENDLOOP.
CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
EXPORTING
i_field_seperator = ','
i_line_header = 'X'
i_tab_raw_data = lt_text
* I_FILENAME =
* I_STEP = 5
TABLES
i_tab_converted_data = lt_flight_t
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_dwpath
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LS_DW_PATH
*&---------------------------------------------------------------------*
FORM frm_get_dwpath CHANGING ps_dw_path.
DATA: ls_dw_path TYPE string.
CLEAR:ls_dw_path.
"获取下载路径
CALL METHOD cl_gui_frontend_services=>directory_browse
EXPORTING
window_title = '选择下载路径'
CHANGING
selected_folder = ls_dw_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF ls_dw_path IS NOT INITIAL.
ps_dw_path = ls_dw_path.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 40 "进度
text = '获取下载路径成功!'. "显示文本
ELSE.
"断开FTP,RFC链接
PERFORM frm_ftp_disconnect.
MESSAGE e001(00) WITH '取消获取下载路径操作'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_dw
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_DW_PATH
*& --> LS_DW_FNAME
*&---------------------------------------------------------------------*
FORM frm_check_dw USING ps_dw_path
ps_dw_fname.
DATA:lv_file TYPE string.
DATA:lv_result TYPE abap_bool.
DATA:lv_rc TYPE sy-subrc.
DATA:lv_answer TYPE c LENGTH 1.
"检查下载路径文件是否已经存在
CONCATENATE ps_dw_path ps_dw_fname INTO lv_file SEPARATED BY '\'.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_file
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF lv_result EQ 'X'.
"文件重复处理
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
defaultoption = 'Y'
textline1 = '文件检查:'
textline2 = '下载路径文件已存在,是否覆盖文件?'
titel = '消息确认'
start_column = 25
start_row = 6
cancel_display = 'X'
IMPORTING
answer = lv_answer. "返回值J:yes;N:no;A:cancel
IF lv_answer EQ 'J'.
"删除文件
CALL METHOD cl_gui_frontend_services=>file_delete
EXPORTING
filename = lv_file
CHANGING
rc = lv_rc
EXCEPTIONS
file_delete_failed = 1
cntl_error = 2
error_no_gui = 3
file_not_found = 4
access_denied = 5
unknown_error = 6
not_supported_by_gui = 7
wrong_parameter = 8
OTHERS = 9.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 80 "进度
text = '删除文件成功!'. "显示文本
* MESSAGE s001(00) WITH '删除文件成功!'.
ENDIF.
ENDIF.
ELSE.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 80 "进度
text = '文件重复性检查成功!'. "显示文本
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.
*&---------------------------------------------------------------------*
*& Form frm_read_file_02
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_DW_FILE
*&---------------------------------------------------------------------*
FORM frm_read_file_02 USING pv_dw_file.
DATA:lv_file TYPE string.
DATA:lv_file_1 TYPE rlgrap-filename.
DATA:lv_result TYPE abap_bool.
DATA:lv_time TYPE i.
DATA:lt_excel TYPE TABLE OF zalsmex_tabline,
ls_excel LIKE LINE OF lt_excel.
DATA: lt_flight_t TYPE TABLE OF zssflight_ftp,
ls_flight_s TYPE zssflight_ftp.
DATA:lv_year TYPE c LENGTH 4,
lv_month TYPE c LENGTH 2,
lv_day TYPE c LENGTH 2.
DATA:lv_point TYPE c LENGTH 1, "记录日期符号
lv_a TYPE i, "截取开始位数
lv_b TYPE i VALUE 1. "截取位数
CLEAR:lv_file_1,lv_file,lv_result,lv_time,ls_excel.
FREE:lt_excel.
lv_file = pv_dw_file.
"循环检查路径下文件是否存在
DO.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_file
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF lv_result EQ 'X' OR lv_time EQ 10.
EXIT.
ELSE.
lv_time = lv_time + 1.
WAIT UP TO 10 SECONDS.
ENDIF.
ENDDO.
IF lv_result NE 'X'.
"断开FTP,RFC链接
PERFORM frm_ftp_disconnect.
MESSAGE e001(00) WITH '文件下载失败终止读取!'.
ELSE.
lv_file_1 = pv_dw_file.
CALL FUNCTION 'ZALSM_EXCEL_TO_INT_TABLE_BM'
EXPORTING
filename = lv_file_1
i_begin_col = 1
i_begin_row = 2
i_end_col = 15
i_end_row = 5000
* IV_SHEET_NAME =
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE e001(00) WITH '文件读取失败!'.
ENDIF.
SORT lt_excel BY row col.
FIELD-SYMBOLS:<fs_excel> LIKE LINE OF lt_excel,
<cell> TYPE any.
LOOP AT lt_excel ASSIGNING <fs_excel>.
"金额处理
IF <fs_excel>-col EQ 4 OR <fs_excel>-col EQ 9.
REPLACE ALL OCCURRENCES OF ',' IN <fs_excel>-value WITH ``.
CONDENSE <fs_excel>-value NO-GAPS.
ENDIF.
ASSIGN COMPONENT <fs_excel>-col OF STRUCTURE ls_flight_s TO <cell>.
IF sy-subrc = 0.
"日期处理
IF <fs_excel>-col EQ 3.
CLEAR:lv_a.
"循环利用正则表达式判断日期符号,在进行拆分补全
DO.
IF cl_abap_matcher=>matches( pattern = '\d'
text = <fs_excel>-value+lv_a(lv_b) ) NE abap_true.
lv_point = <fs_excel>-value+lv_a(lv_b).
EXIT.
ELSE.
lv_a = lv_a + 1.
ENDIF.
ENDDO.
IF lv_point IS NOT INITIAL.
SPLIT <fs_excel>-value AT lv_point INTO lv_year lv_month lv_day.
IF lv_month LT 10.
lv_month = |{ lv_month ALPHA = IN }|.
ENDIF.
IF lv_day LT 10.
lv_day = |{ lv_day ALPHA = IN }|.
ENDIF.
CONCATENATE lv_year lv_month lv_day INTO <fs_excel>-value SEPARATED BY ``.
CONDENSE <fs_excel>-value NO-GAPS.
ENDIF.
ENDIF.
MOVE <fs_excel>-value TO <cell>.
ENDIF.
AT END OF row.
APPEND ls_flight_s TO lt_flight_t.
CLEAR:ls_flight_s.
ENDAT.
ENDLOOP.
ENDIF.
ENDFORM.