zoukankan      html  css  js  c++  java
  • SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器

    作者:明光烁亮
    出处:http://www.cnblogs.com/hezhongxun/
    微信号:HEme922 欢迎加好友一起交流SAP! 视频资料共享。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    需求:今天接到一个FTP的工作,就是每天晚上把当天某个报表的数据自动保存excel上传到FTP服务器。

    SAP已经有现成的FTP函数使用,可以通过函数的方式来实现,实现前先准备一些数据:

    User:登录FTP的用户名

    Password:登录FTP的密码

    Host:FTP 的IP地址

    Path: FTP的文件存放路径

    RFC_Destination:意思是在前台还是后台的方式运行。前台:SAPFTP   后台:SAPFTPA

    Command:操作FTP的命令,这里使用  ' CD /Path  '  打开文件夹

    Filename:文件名 

    先在本地试下能不能连接FTP服务器

      

    下面简单说明下FTP常用的函数

    HTTP_SCRAMBLE:用户名密码加密

    FTP_CONNECT:创建FTP服务器连接

    FTP_COMMAND:执行FTP命令

    FTP_R3_TO_SERVER:在SAP端发送数据到FTP 服务器

    FTP_DISCONNECT:关闭FTP连接

    RFC_CONNECTION_CLOSE:关闭RFC连接

    SAP提供的函数组是SFTP,系统提供的函数挺多,可以去研究下,我这里只用到上面的函数。

    接下来就是怎么把内表的数据转换成可以上传的格式,这里就是把内表转换成二进制,有以下方法可以使用:

    SAP_CONVERT_TO_CSV_FORMAT
    SAP_CONVERT_TO_TXT_FORMAT
    SAP_CONVERT_TO_TEX_FORMAT
    SAP_CONVERT_TO_XLS_FORMAT
    SAP_CONVERT_TO_XML_FORMAT

    SCMS_TEXT_TO_BINARY

    我用到的方法只是前两个和最后一个,第四个只能直接导出文件,可能还没有找到合适的方法,以后再做弥补。

    下面就是上代码了

    DATA: l_user(30TYPE VALUE 'admin'"用户名
          l_pwd(30)  TYPE VALUE 'Aa123456',      "密码
          l_host(64TYPE VALUE '192.168.0.3',   "FTP服务器地址
          l_path(64TYPE VALUE '/HYS',       "路径
          l_rc(1),
          l_dest     TYPE rfcdes-rfcdest VALUE 'SAPFTPA'"前端:sapftp   后台运行:sapftpa.

    DATA: l_handle       TYPE i,
          l_command(255TYPE c,
          l_result       TYPE TABLE OF txmisporow,
          l_filename(50TYPE c,
          l_pwdlength    TYPE i,
          l_length       TYPE i,
          l_ftppwd(255)  TYPE c,
          l_key          TYPE VALUE 26101957,
          l_encoding     TYPE abap_encoding VALUE '8400'.


    DATA: lt_text TYPE truxs_t_text_data.

    DATA: l_binary_tab LIKE TABLE OF solix.

    DATABEGIN OF ls_tab,
            tline(4096),
          END OF ls_tab.
    DATA: lt_tab LIKE TABLE OF ls_tab.

    l_pwdlength strlen( l_pwd ).


    *****************开始FTP传输数据**********
      CALL FUNCTION 'HTTP_SCRAMBLE' “密码加密
        EXPORTING
          source      = l_pwd
          sourcelen   = l_pwdlength
          key         = l_key
        IMPORTING
          destination = l_ftppwd.

      "创建FTP连接

      CALL FUNCTION 'FTP_CONNECT'
        EXPORTING
          user            = l_user
          password        = l_ftppwd
          host            = l_host
          rfc_destination = l_dest
        IMPORTING
          handle          = l_handle
        EXCEPTIONS
          not_connected   1
          OTHERS          2.

      IF sy-subrc <> 0.
        MESSAGE 'FTP path error' TYPE 'E'.
      ENDIF.

    l_rc = COND #WHEN l_path+(1'/' THEN ' ' ELSE ' /' ).
      CONCATENATE 'cd' l_path INTO l_command SEPARATED BY l_rc. "拼接FTP命令,这里是打开文件夹地址

      CALL FUNCTION 'FTP_COMMAND' ”执行FTP命令
        EXPORTING
          handle        = l_handle
          command       = l_command
        TABLES
          data          = l_result
        EXCEPTIONS
          tcpip_error   1
          command_error 2
          data_error    3
          OTHERS        4.

      IF sy-subrc <> 0.
        PERFORM ftp_disconnect USING l_handle l_dest.
        MESSAGE 'FTP path error' TYPE 'E'.
      ENDIF.

      CONCATENATE 'solist' sy-datum  '.csv' INTO l_filename.
    "内表数据转换成CSV或者excel格式
      CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT' 
        TABLES
          i_tab_sap_data       = <dyn_table>
        CHANGING
          i_tab_converted_data = lt_text
        EXCEPTIONS
          conversion_failed    1
          OTHERS               2.

      LOOP AT lt_text ASSIGNING FIELD-SYMBOL(<text>). “把数据存到一个单列的内表,等一下用作转换二进制用
        APPEND VALUE #( tline = <text> TO lt_tab.
      ENDLOOP.

    CALL FUNCTION 'SCMS_TEXT_TO_BINARY' ”转换成二进制文件
        EXPORTING
          encoding      = l_encoding
        IMPORTING
          output_length = l_length
        TABLES
          text_tab      = lt_tab
          binary_tab    = l_binary_tab
        EXCEPTIONS
          failed        1
          OTHERS        2.

    “刚刚已经用FTP命令打开的文件夹,现在可以直接把二进制文件传至服务器了。
    CALL FUNCTION 'FTP_R3_TO_SERVER'
        EXPORTING
          handle         = l_handle
          fname          = l_filename
          blob_length    = l_length
          character_mode ' '
        TABLES
          blob           = l_binary_tab
        EXCEPTIONS
          tcpip_error    1
          command_error  2
          data_error     3
          OTHERS         4.

      CASE sy-subrc.
        WHEN 0.
          MESSAGE 'Upload FTP Success' TYPE 'S'.
        WHEN 1.
          MESSAGE 'Upload FTP Failure (Tcpip_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
        WHEN 2.
          MESSAGE 'Upload FTP Failure (Command_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
        WHEN 3.
          MESSAGE 'Upload FTP Failure (Data_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
        WHEN OTHERS.
          MESSAGE 'Upload FTP Failure (Other)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
      ENDCASE.

    ”关闭FTP 连接
    CALL FUNCTION 'FTP_DISCONNECT'
        EXPORTING
          handle = p_handle.

      CALL FUNCTION 'RFC_CONNECTION_CLOSE'
        EXPORTING
          destination          = p_dest
        EXCEPTIONS
          destination_not_open 1
          OTHERS               2.

    现在就可以试下通过后台跑程序了,先运行程序,然后设置后台立即执行 ,保存后程序将在后台运行。

    最后到SM37查看程序运行情况,还有打开FTP服务器查看文件

     SM37提示FTP运行正常,文件也保存到了,所以程序执行没问题。

    注意运行后台任务时,文件名必须没有中文,我刚开始就用了中文,后台一直报错,后来改了文件名才运行正常。

  • 相关阅读:
    文本框改造之多选下拉控件
    多附件上传控件
    Linq to Sql:更新之属性遍历法
    如何在HTML5页面中启动本地的App? 下面的方法应该可以。
    Nodejs 学习笔记-相片整理Demo(二)
    Nodejs 学习笔记-相片整理Demo(一)
    前端学习笔记一:什么是W3C?
    网页嵌入调用 全国各城市天气代码
    html页面清除缓存
    判断鼠标动作,可以给鼠标在标签不同区域的动作分别写不同的效果
  • 原文地址:https://www.cnblogs.com/hezhongxun/p/13876993.html
Copyright © 2011-2022 走看看