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.

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

相关推荐
章豪Mrrey nical6 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
派大鑫wink7 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼8 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII8 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home8 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3218 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446238 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL8 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小信啊啊9 小时前
Go语言切片slice
开发语言·后端·golang
Victor35611 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端