ABAP FTP文件处理

一、基础知识

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.

4、详细代码最上面的附件链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ABAP小码奴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值