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.

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

相关推荐
苏三的开发日记41 分钟前
grafana里面怎么添加Prometheus数据源监控MySQL
后端
找不到对象就NEW一个44 分钟前
wechatapi,微信二次开发-连载篇(二)通讯录模块
后端·微信
Y***98511 小时前
【学术会议论文投稿】Spring Boot实战:零基础打造你的Web应用新纪元
前端·spring boot·后端
q***33371 小时前
SpringMVC新版本踩坑[已解决]
android·前端·后端
武子康1 小时前
大数据-166 Apache Kylin 1.6 Streaming Cubing 实战:Kafka 到分钟级 OLAP
大数据·后端·apache kylin
回家路上绕了弯1 小时前
彻底解决超卖问题:从单体到分布式的全场景技术方案
分布式·后端
8***29312 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
IT_陈寒2 小时前
Python高手都在用的5个隐藏技巧,让你的代码效率提升50%
前端·人工智能·后端
Qiuner2 小时前
Spring Boot 机制二:配置属性绑定 Binder 源码解析(ConfigurationProperties 全链路)
java·spring boot·后端·spring·binder