SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器
今天接到一个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服务器的更多相关文章
- [SAP ABAP开发技术总结]文本文件、Excel文件上传下传
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- PHP中导出Excel,将数据以Excel形式导出
现在,很多地方都需要导出数据,这里说一种简单的方法将数据以Excel的形式导出,方法如下: <?php date_default_timezone_set('PRC');//设置时区 /*设置h ...
- 【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp
一.本人环境描述 1.oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0 2.Linux为centos6.5 32位,安装在Oracle VM Vir ...
- excel打开csv格式的文件,数字末尾都变成零,解决方式
excel打开csv格式的文件,数字末尾都变成零,解决方式
- 转载: ABAP动态内表操作
顾名思义,动态表的列是可以根据数据的变化而变化的,会使报表显示更简洁漂亮. 以下是实现方法. ------------------------------------------- 1, 创建动态内表 ...
- 转ABAP将内表行列转换实例(动态内表) .
把内表的行列转换,网上的例子很多,但是新人想看懂,几乎很难,所以总结下我是怎么完成的. 比如:你的内表如图: 你想让内表最后展示成这样:如图: 那么完成之后会是这样: 完成这个过程,得用到动态内表.看 ...
- ABAP 动态内表添加单元格颜色字段
*动态内表alv显示时要求某些单元格显示颜色 *wa_fldcat-datatype不能添加LVC_T_SCOL类型,在创建好内表之后,再添加颜色列. DATA: wa_fldcat TYPE lvc ...
- ABAP 动态内表 动态ALV
DATA: DY_TABLE TYPE REF TO DATA, DY_WA TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE ...
- 七十三、SAP中清空内表的三种方式
一.上代码 二.需要注意的是 * CLEAR 只能清空不带WITH HEADER LINE的内表* REFRESH 能清空内表,但是不回收内存* FREE 能清空内表并回收内存,但是此内表还能继续使用
随机推荐
- hystrix源码小贴士之调用异常处理
executeCommandAndObserve方法处理onerror异常. return execution.doOnNext(markEmits) .doOnCompleted(markOnCom ...
- python3 函数的参数
函数的参数 形参(函数定义时) + 实参(函数调用时) 形参:形式参数 在函数的定义处定义的参数,比如def func(参数1, 参数2, 参数3...) 普通参数(位置参数), 默认参数,普通收集参 ...
- redis 的基本使用
Linux上查看redis是否运行 ps -ef | grep redis 还能查看到Linux的安装路径. set rediskey redisvalue 在redis里面存储了一个名称为r ...
- 面试可能遇到的关联式容器(map、set等)相关问题
>>>. map与set的区别是什么,各有哪些优势? map中存储的数据是以键值对(key - value)形式并且通过排序(比较key,默认以 '<' 方式排序)存在的( ...
- Spring AOP系列(一)— 代理模式
Spring AOP系列(一)- 代理模式 AOP(Aspect Oriented Programming)并没有创造或使用新的技术,其底层就是基于代理模式实现.因此我们先来学习一下代理模式. 基本概 ...
- Python-找字典中公共key-zip reduce lambda
场景实例: 西班牙足球联赛,每轮球员进球统计: 第一轮:{'1':1,'2':4,'5':2,'7':3} 第一轮:{'2':1,'5':4,'6':2,'3':3} 第一轮:{'1':1,'4':4 ...
- SpringBoot2.3中@Async实现异步
启动加上@EnableAsync ,需要执行异步方法上加入@Async. 在方法上加上@Async之后 底层使用多线程技术. 不使用异步 先关代码: package com.yiyang.myfirs ...
- 024 01 Android 零基础入门 01 Java基础语法 03 Java运算符 04 关系运算符
024 01 Android 零基础入门 01 Java基础语法 03 Java运算符 04 关系运算符 本文知识点:Java中的关系运算符 关系运算符
- JavaScript事件对象属性e.target和this的区别
前言: Event对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象eve ...
- 最全153道Spring全家桶面试题,你都碰到过哪些?(含答案解析)
前言 Spring 框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶. 毋庸置疑,Spring 早已成为 Java 后端开发的行业标准,无数的公司选择 Spring 作为基础的 ...