SAP ABAP 如何读取FTP读取CSV文件到内表

一、确立RFC连接配置

执行SAP的标准程序RSFTP005,自动创建两个名为SAPFTP为SAPFTPA的TCP/IP的RFC连接。

二、连接FTP服务器

进行FTP连接配置,维护配置表SM30:SAPFTP_SERVERS_V

se38执行测试程序rsftp002测试是否连接:

一般是因为密码错误,注意账号大小写,修正后如下:

三、连接服务:

java 复制代码
FORM frm_connect .  
  
  "------------------------  
  TYPES: BEGIN OF t_text,  
           text(2000) TYPE c,  
         END OF t_text.  
  DATA: i_text       TYPE TABLE OF t_text,  
        i_text2      TYPE TABLE OF t_text,  
        lt_temp_text TYPE TABLE OF t_text,  
        mx1          TYPE TABLE OF t_text,  
        mxs          LIKE LINE OF lt_temp_text,  
        wa_text      TYPE t_text,  
        i_bintab     TYPE w3mimetabtype.  
  DATA:lv_hdl      TYPE i,  
*       lv_key      TYPE i VALUE 26101957,  
       lv_slen     TYPE i,  
       lv_cmd(120),  
       lv_pwd      TYPE text30,  
       li_result   TYPE TABLE OF text256 , "WITH HEADER LINE,  
       ls_result   TYPE text256,  
       result      TYPE TABLE OF text256,  
*       lv_dest     TYPE rfcdes-rfcdest,  
       lv_ftpname  TYPE text150,  
       ln          TYPE i,  
       blen        TYPE i.  
  "----------------------------------  
  TYPES: BEGIN OF ty_ftp,  
           line(255) TYPE c,  
         END OF ty_ftp,  
         BEGIN OF ty_blob,  
           line(255) TYPE x,  
         END OF ty_blob.  
  
  DATA: lt_ftp  TYPE TABLE OF ty_ftp,  
        ls_ftp  TYPE ty_ftp,  
        lt_blob TYPE TABLE OF ty_blob.  
  
  DATA: lv_dest     TYPE rfcdest VALUE 'SAPFTP',  "操作标识  
        lv_handle   TYPE i,  
        lv_len      TYPE i,  
        lv_key      TYPE i VALUE 26101957,  
*        lv_cmd(255) TYPE c,  
        lv_blob_len TYPE i,  
        lv_xstr     TYPE xstring,  
        lv_dir(255) TYPE c VALUE '/upload'. "指定目录  
  
  DATA: lv_msg TYPE string.  
  "账号密码信息
  READ TABLE gt_con INTO DATA(ls_con) INDEX 1.  
  lv_len = strlen( ls_con-zpwd ).  
  
  "密码加密  
  CALL FUNCTION 'HTTP_SCRAMBLE'  
    EXPORTING  
      source      = ls_con-zpwd "原始密码  
      sourcelen   = lv_len "密码长度  
      key         = lv_key "加密方式  
    IMPORTING  
      destination = ls_con-zpwd. "加密密码  
  
  "连接ftp服务器  
  CALL FUNCTION 'FTP_CONNECT'  
    EXPORTING  
      user            = ls_con-zuser  
      password        = ls_con-zpwd  
      host            = ls_con-ip  
      rfc_destination = lv_dest  
    IMPORTING  
      handle          = lv_handle  
    EXCEPTIONS  
      OTHERS          = 1.  
  
  IF sy-subrc <> 0.  
    "获取错误  
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'  
      EXPORTING  
        msgid               = sy-msgid  
        msgnr               = sy-msgno  
        msgv1               = sy-msgv1  
        msgv2               = sy-msgv2  
        msgv3               = sy-msgv3  
        msgv4               = sy-msgv4  
      IMPORTING  
        message_text_output = lv_msg.  
  ELSE.  
    "执行CMD命令(列出指定文件夹下所有的文件)  
    CONCATENATE 'nlist' lv_dir INTO lv_cmd SEPARATED BY space.  
  
    CALL FUNCTION 'FTP_COMMAND'  
      EXPORTING  
        handle  = lv_handle  
        command = lv_cmd  
      TABLES  
        data    = lt_ftp  
      EXCEPTIONS  
        OTHERS  = 2.  
    "读取CSV文件
    DATA file TYPE c LENGTH 50 VALUE '.csv'.  
    LOOP AT lt_ftp INTO ls_ftp WHERE line CS lv_dir.  
      SEARCH ls_ftp FOR file.  
      IF sy-subrc = 0.  
        lv_ftpname = file.  
        REFRESH i_text.  
        "读取文件  
        CALL FUNCTION 'FTP_SERVER_TO_R3'  
          EXPORTING  
            handle        = lv_handle  
            fname         = ls_ftp-line  
          IMPORTING  
            blob_length   = lv_blob_len  
          TABLES  
            blob          = lt_blob  
          EXCEPTIONS  
            tcpip_error   = 1  
            command_error = 2  
            data_error    = 3  
            OTHERS        = 4.  
        CALL FUNCTION 'SCMS_BINARY_TO_TEXT'  
          EXPORTING  
            input_length  = lv_blob_len  
            encoding      = '8400' "4110:UTF8,8400:GB2312  
          IMPORTING  
            output_length = lv_blob_len  
          TABLES  
            binary_tab    = lt_blob  
            text_tab      = i_text  
          EXCEPTIONS  
            failed        = 1  
            OTHERS        = 2.  
        IF i_text[] IS NOT INITIAL.  
          LOOP AT i_text INTO wa_text FROM 2."从第二行开始读取  
            REFRESH lt_temp_text.  
            SPLIT wa_text AT ',' INTO TABLE lt_temp_text.  
            IF lt_temp_text IS NOT INITIAL.  
              CLEAR gs_data.  
              "字段赋值  
              gs_data-mid = lt_temp_text[ 1 ].  
              gs_data-transaction_dat = lt_temp_text[ 2 ].  
              gs_data-transaction_tim = lt_temp_text[ 3 ].  
              gs_data-tid = lt_temp_text[ 4 ].  
              APPEND gs_lkl TO gt_lkl.  
            ENDIF.  
          ENDLOOP.  
        ENDIF.  
      ENDIF.  
    ENDLOOP.  
    "删除文件  
*    IF gt_lkl IS NOT INITIAL.  
*      "解析成功 删除csv 文件  
*      lv_cmd = 'cd /upload'.  
*      CALL FUNCTION 'FTP_COMMAND'  
*        EXPORTING  
*          handle  = lv_handle  
*          command = lv_cmd  
*        TABLES  
*          data    = lt_ftp  
*        EXCEPTIONS  
*          OTHERS  = 2.  
*      CLEAR lt_ftp.  
*      lv_cmd = 'mdelete *.csv'.  
*      CALL FUNCTION 'FTP_COMMAND'  
*        EXPORTING  
*          handle  = lv_handle  
*          command = lv_cmd  
*        TABLES  
*          data    = lt_ftp  
*        EXCEPTIONS  
*          OTHERS  = 2.  
*      IF sy-subrc = 0.  
*        lv_msg = lv_msg && 'CSV文件删除成功;'.  
*      ENDIF.  
*    ENDIF.  
    "关闭连接  
    CALL FUNCTION 'FTP_DISCONNECT'  
      EXPORTING  
        handle = lv_handle  
      EXCEPTIONS  
        OTHERS = 4.  
  
  ENDIF.  
  IF gt_lkl IS NOT INITIAL.  
    MODIFY zzt_trans_lkl FROM TABLE gt_lkl.  
    IF sy-subrc = 0.  
      COMMIT WORK AND WAIT .  
      lv_msg = lv_msg && 'CSV解析后存表成功,请前往表ZZT_TRANS_LKL查看;'.  
    ENDIF.  
  ENDIF.  
  cl_demo_output=>write( lv_msg ).  
  cl_demo_output=>write( lt_ftp ).  
  cl_demo_output=>display(  ).  
  
ENDFORM.

------至此文件解析完成。

相关推荐
神奇小汤圆5 分钟前
Unsafe魔法类深度解析:Java底层操作的终极指南
后端
神奇小汤圆38 分钟前
浅析二叉树、B树、B+树和MySQL索引底层原理
后端
文艺理科生1 小时前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling1 小时前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅1 小时前
springBoot项目有几个端口
java·spring boot·后端
Luke君607971 小时前
Spring Flux方法总结
后端
define95271 小时前
高版本 MySQL 驱动的 DNS 陷阱
后端
忧郁的Mr.Li1 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
暮色妖娆丶2 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_2 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring