今天接到一个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(30) TYPE c VALUE 'admin', "用户名
      l_pwd(30)  TYPE c VALUE 'Aa123456',      "密码
      l_host(64) TYPE c VALUE '192.168.0.3',   "FTP服务器地址
      l_path(64) TYPE c VALUE '/HYS',       "路径
      l_rc(1),
      l_dest     TYPE rfcdes-rfcdest VALUE 'SAPFTPA'. "前端:sapftp   后台运行:sapftpa.

DATA: l_handle       TYPE i,
      l_command(255) TYPE c,
      l_result       TYPE TABLE OF txmisporow,
      l_filename(50) TYPE c,
      l_pwdlength    TYPE i,
      l_length       TYPE i,
      l_ftppwd(255)  TYPE c,
      l_key          TYPE i 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.

DATA: BEGIN 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运行正常,文件也保存到了,所以程序执行没问题。

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

SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器的更多相关文章

  1. [SAP ABAP开发技术总结]文本文件、Excel文件上传下传

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. PHP中导出Excel,将数据以Excel形式导出

    现在,很多地方都需要导出数据,这里说一种简单的方法将数据以Excel的形式导出,方法如下: <?php date_default_timezone_set('PRC');//设置时区 /*设置h ...

  3. 【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp

    一.本人环境描述      1.oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0      2.Linux为centos6.5 32位,安装在Oracle VM Vir ...

  4. excel打开csv格式的文件,数字末尾都变成零,解决方式

    excel打开csv格式的文件,数字末尾都变成零,解决方式

  5. 转载: ABAP动态内表操作

    顾名思义,动态表的列是可以根据数据的变化而变化的,会使报表显示更简洁漂亮. 以下是实现方法. ------------------------------------------- 1, 创建动态内表 ...

  6. 转ABAP将内表行列转换实例(动态内表) .

    把内表的行列转换,网上的例子很多,但是新人想看懂,几乎很难,所以总结下我是怎么完成的. 比如:你的内表如图: 你想让内表最后展示成这样:如图: 那么完成之后会是这样: 完成这个过程,得用到动态内表.看 ...

  7. ABAP 动态内表添加单元格颜色字段

    *动态内表alv显示时要求某些单元格显示颜色 *wa_fldcat-datatype不能添加LVC_T_SCOL类型,在创建好内表之后,再添加颜色列. DATA: wa_fldcat TYPE lvc ...

  8. ABAP 动态内表 动态ALV

    DATA: DY_TABLE TYPE REF TO DATA, DY_WA TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE ...

  9. 七十三、SAP中清空内表的三种方式

    一.上代码 二.需要注意的是 * CLEAR 只能清空不带WITH HEADER LINE的内表* REFRESH 能清空内表,但是不回收内存* FREE 能清空内表并回收内存,但是此内表还能继续使用

随机推荐

  1. hystrix文档翻译之工作原理

    流程图 下面的图片显示了一个请求在hystrix中的流程图. 1.构造一个HystrixCommand或者HystrixObservableCommand对象 第一步是创建一个HystrixComma ...

  2. CVE-2020-0796(Windows SMBv3) RCE漏洞复现

    CVE-2020-0796 攻击机:win10:192.168.205.1 靶机win10:192.168.205.132 关闭defender防火墙 0x01 影响版本 Windows 10 190 ...

  3. Java Web学习(七)HttpServletResponse(客户端响应)

    一.定义 HttpServletResponse对象代表服务端的响应,通过这个对象提供的方法,可以向客户机输出数据. 二.常用方法 在JavaWeb开发中,只要是写URL地址,那么建议最好以" ...

  4. 推荐一个超牛的SpringCloud微服务项目,开发脚手架

    前言 Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,具有统一授权.认证后台管理系统,其中包含具备用户管理.资源权限管理.网关API 管理等多个模块,支持多业务系统 ...

  5. 智慧组织(SO)如何敏捷构建?

    人类社会正处于千年未有之变局的关键时刻--互联网.大数据.AI和实体经济深度融合,数据正在重新定义世界并重构财富体系."新旧交织.破立并存",数字经济方兴未艾,传统势力逐步淡出.各 ...

  6. Linux系统编程 —互斥量mutex

    互斥量mutex 前文提到,系统中如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象.为了实现同步机制,Linux中提供了多种方式,其中一种方式为互斥锁mutex(也称 ...

  7. Django-当前菜单激活状态-模版 request | slice

    如何满足这个需求? 1. view中传递过来一个当前页面的参数标识,通过模版语言进行判断 {% if current_page == 'index' %}active{% endif %} # 每一个 ...

  8. 03 . Docker数据资源管理与网络

    Docker数据卷 在容器中管理数据主要有两种方式 # 数据卷(Data volumes) # 数据卷容器(Data volume containers) # 数据卷是一个可供一个或多个容器使用的特殊 ...

  9. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  10. IDEA推送docker镜像到私服/利用dockerfile-maven-plugin插件在springboot中上传镜像到远程的docker服务器、远程仓库

    利用dockerfile-maven-plugin插件在springboot中上传镜像到远程仓库      这篇文章讲解在开发工具中把打包好的jar编译成docker镜像,上传到远程的docker服务 ...