一步步实现ABAP后台导入EXCEL到数据库【2】
前文:http://www.cnblogs.com/hhelibeb/p/5912330.html
既然后台作业只能在应用服务器运行,那么,我们可以先将要上传的数据保存在应用服务器中,之后再以后台作业的形式导入数据库。这里需要使用的关键字是OPEN DATASET。
1. OPEN DATASET
Syntax
OPEN DATASET dset
FOR { INPUT | OUTPUT | APPENDING | UPDATE }
IN { { BINARY MODE }
| { TEXT MODE ENCODING { DEFAULT
| {UTF-8 [SKIPPING|WITH BYTE-ORDER MARK]}
| NON-UNICODE }
[WITH {NATIVE|SMART|UNIX|WINDOWS} LINEFEED] }
| { LEGACY BINARY MODE [{BIG|LITTLE} ENDIAN]
[CODE PAGE cp] }
| { LEGACY TEXT MODE [{BIG|LITTLE} ENDIAN]
[CODE PAGE cp]
[WITH {NATIVE|SMART|UNIX|WINDOWS} LINEFEED] } }
[AT POSITION pos]
[TYPE attr]
[FILTER opcom]
[MESSAGE msg]
[IGNORING CONVERSION ERRORS]
[REPLACEMENT CHARACTER rc].
效果
打开由dset指定的应用服务器上的文件。
附加项
- FOR { INPUT | OUTPUT | APPENDING | UPDATE }
以输入、输出、追加、更新模式打开文件.
- IN [LEGACY] { BINARY | TEXT } MODE
以普通的二进制或者文本模式打开文件, 或者以LEGACY二进制或文本模式. LEGACY模式可以指定字节顺序和内码表。在Unicode系统中,LEGACY关键字可能会影响到以东亚文字写入的字段的内容。因此,建议只在没有使用LEGACY附加项的打开的文本中写入内容。
- ENCODING {DEFAULT|UTF-8|NON-UNICODE}
决定了使用何种字符表现形式来操作文件的内容:DEFAULT -
Unicode系统中的UTF-8; 非Unicode系统则不转换.NON-UNICODE -在Unicode系统中,内码表与非Unicode系统文本环境(text evirionment)一致; 非Unicode系统则不转换.
tips: text evirionment
| text evirionment是ABAP程序的运行时环境的一部分,由语言、locale和系统内码表组成。同一个内部会话中的所有程序有一个共同的文本环境。默认情况下,内部会话的text environment由登录语言决定,并且也可以被语句set locale指定。当前的text environment包含在系统字段sy-langu中 |
- SKIPPING|WITH BYTE-ORDER MARK
控制UTF-8文件中的字节顺序标记(BOM)操作.
- {BIG|LITTLE} ENDIAN
决定文件中数值型数据对象被操作的顺序.
- CODE PAGE cp
决定文件中字符型数据对象以指定的内码表cp操作.
- AT POSITION pos
将文件指针设置到指定的位置pos.
- TYPE attr
为文件设置操作系统参数,或者控制文本文件的行尾选项.
- FILTER opcom
将一个语句传输给操作系统.
例子:
创建一个文件test.dat。TYPE指定的文件属性是操作系统IBM i5/OS(在OS/400之前)中的。
OPEN DATASET 'test.dat'
TYPE 'lrecl=80, blksize=8000, recfm=FB'
FOR OUTPUT IN TEXT MODE
ENCODING DEFAULT
WITH SMART LINEFEED.
- MESSAGE msg
如果发生了错误,可以在msg中返回操作系统信息.
- IGNORING CONVERSION ERRORS
如果会话错误发生,该语句可以阻止异常.
- REPLACEMENT CHARACTER rc
指定一个字符rc替换无法转换的字符。如果未指定rc,则使用“#”.
使用OPEN DATASET来实现上传数据到应用服务器,即程序中的output_data子进程:
*&---------------------------------------------------------------------*
*& Form OUTPUT_DATA
*&---------------------------------------------------------------------*
* 将数据写入到Applacation Server
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM output_data . DATA s_file TYPE rlgrap-filename. PERFORM generate_filename_in_server USING s_file. OPEN DATASET s_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = . LOOP AT itab INTO wa. TRANSFER wa TO s_file. IF sy-subrc <> .
MESSAGE 'ERROR!!' TYPE 'E'.
ENDIF. ENDLOOP. CLOSE DATASET s_file. WRITE: /'写入服务器文件成功'. PERFORM submit_insert_program USING s_file. "调用导入程序 ELSE. WRITE: /'写入服务器文件失败' . ENDIF. ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_file_name_in_server
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM generate_filename_in_server USING s_file . DATA s_name TYPE string. CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = p_source
IMPORTING
stripped_name = s_name
* FILE_PATH =
EXCEPTIONS
x_error =
OTHERS = .
IF sy-subrc <> .
* Implement suitable error handling here
ENDIF. GET TIME. CONCATENATE '/tmp/' sy-datum sy-uzeit s_name '.txt' INTO s_file. TRANSLATE s_file TO LOWER CASE. ENDFORM.
2,实现导入程序
上传到服务器的程序已经实现,现在新建一个程序ztest_import,实现导入到数据库的功能。同样使用OPEN DATASET语句来实现:
REPORT ztest_import. SELECTION-SCREEN: BEGIN OF BLOCK blk.
PARAMETERS: s_file TYPE rlgrap-filename .
SELECTION-SCREEN END OF BLOCK blk. DATA: BEGIN OF wa,
col1() TYPE c,
col2() TYPE c,
col3() TYPE c,
END OF wa. FIELD-SYMBOLS: <hex_container> TYPE c. TRANSLATE s_file TO LOWER CASE. OPEN DATASET s_file FOR INPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = . ASSIGN wa TO <hex_container> CASTING. DO.
"由于没有使用MAXIMUM LENGTH选项,所以每次读取的最大字节数
"由<hex_container>所占字节数决定
READ DATASET s_file INTO <hex_container>. IF sy-subrc = . *"ztestly是在SE11中新建的表,结构和上传的excel相符,过程省略 INSERT ztestly FROM wa. ELSE. EXIT. ENDIF. ENDDO. CLOSE DATASET s_file. DELETE DATASET s_file. "成功执行导入后,删除服务器上的文件 ELSE. MESSAGE 'open failed' TYPE 'I
3,在上传程序中调用导入程序
如果你看过我博客中有关submit的文章,可能会记得,submit语句是可以安排程序作为后台作业进行的。下面我们就使用这个特性,在上传程序ztest_upload的子程序submit_insert_program中调用导入程序ztest_import,代码如下:
*&---------------------------------------------------------------------*
*& Form SUBMIT_INSERT_PROGRAM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM submit_insert_program USING s_file. DATA: w_jobid TYPE tbtcjob-jobcount,
w_stepnm TYPE tbtcjob-stepcount,
p_job_nm TYPE tbtcjob-jobname VALUE 'ZTEST_IMPORT'. CLEAR:w_jobid. CALL FUNCTION 'JOB_OPEN'
EXPORTING
* DELANFREP = ' '
* JOBGROUP = ' '
jobname = p_job_nm
* SDLSTRTDT = NO_DATE
* SDLSTRTTM = NO_TIME
IMPORTING
jobcount = w_jobid
EXCEPTIONS
cant_create_job =
invalid_job_data =
jobname_missing =
OTHERS = . SUBMIT ztest_import WITH s_file = s_file VIA JOB p_job_nm NUMBER w_jobid AND RETURN. IF sy-subrc = . CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = w_jobid
jobname = p_job_nm
strtimmed = 'X'
EXCEPTIONS
cant_start_immediate =
invalid_startdate =
jobname_missing =
job_close_failed =
job_nosteps =
job_notex =
lock_failed =
OTHERS = . IF sy-subrc <> .
WRITE: /'后台作业发布失败'.
ELSE.
WRITE: /'后台作业发布成功'.
ENDIF. ENDIF. ENDFORM.
运行zterst_upload,上传一个有效的excel文件,我们便可以在上一篇文章提到的自有作业界面看到后台作业执行成功,并且在SE16中查到自建表zestly中已经插入了相关数据。如果要改变后台作业的计划时间,可以在JOB_CLOSE函数中设置相关参数。
一步步实现ABAP后台导入EXCEL到数据库【2】的更多相关文章
- 一步步实现ABAP后台导入EXCEL到数据库【3】
在一步步实现ABAP后台导入EXCEL到数据库[2]里,我们已经实现计划后台作业将数据导入数据库的功能.但是,这只是针对一个简单的自定义结构的导入程序.在实践应用中,面对不同的表.不同的导入文件,我们 ...
- 一步步实现ABAP后台导入EXCEL到数据库【1】
在SAP的应用当中,导入.导出EXCEL文件的情况是一个常见的需求,有时候用户需要将大量数据定期导入到SAP的数据库中.这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台 ...
- 如何使用NPOI 导出到excel和导入excel到数据库
近期一直在做如何将数据库的数据导出到excel和导入excel到数据库. 首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/). 我用的NPOI1.2.5稳定版. 使 ...
- django后台导入excel文件
1.django 如何从后台上传excel中批量解析数据 要从django后台导入的excel中批量解析数据,举一个例子,我们向后抬批量导入svn历史数据数据格式 假设excel表中有4列,每列分别是 ...
- OpenXML_导入Excel到数据库
(1).实现功能:通过前台选择.xlsx文件的Excel,将其文件转化为DataTable和List集合 (2).开发环境:Window7旗舰版+vs2013+Mvc4.0 (2).在使用中需要用到的 ...
- ASP.NET MVC导入excel到数据库
MVC导入excel和webform其实没多大区别,以下为代码: 视图StationImport.cshtml的代码: @{ ViewBag.Title = "StationImport&q ...
- xadmin后台 导入 excel 功能拓展
新建 excel 文件 在 xadmin 的 plugins 下添加一个 excel.py # _*_ coding:utf-8 _*_ __author__ = "yangtuo" ...
- jxl读取excel实现导入excel写入数据库
@RequestMapping(params = "method=import", method = RequestMethod.POST) @ResponseBody publi ...
- OpenXML_导入Excel到数据库(转)
(1).实现功能:通过前台选择.xlsx文件的Excel,将其文件转化为DataTable和List集合 (2).开发环境:Window7旗舰版+vs2013+Mvc4.0 (2).在使用中需要用到的 ...
随机推荐
- Android快乐贪吃蛇游戏实战项目开发教程-06虚拟方向键(五)绘制方向键箭头
本系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html本系列教程项目源码GitHub地址:https://github.com/jack ...
- linux-centos在VM中的网络配置
1.自动获取IP地址 虚拟机使用桥接模式,相当于连接到物理机的网络里,物理机网络有DHCP服务器自动分配IP地址. #dhclient 自动获取ip地址命令 #ifconfig 查询系统里网卡信息,i ...
- OpenWrt中开启usb存储和samba服务
在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wik ...
- 在Redhat上为.Net 项目构建基于Jenkins + Github + Mono 的持续集成环境
在Redhat enterprise 6.5 的服务器上,为在gutub 上的 .net 项目构建一个持续集成环境,用到了Jenkins和mono.因公司的服务器在内网,访问外网时要通过代理,所以在很 ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- 【初探Spring】------Spring IOC(二):初始化过程---简介
首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...
- 我的公司培训讲义(1):.NET开发规范教程
这是1年多以前我在公司所做讲座的讲义,现在与园友们分享,欢迎拿去使用.一起讨论.文中有若干思考题,对园友们是小菜一碟.另有设计模式讲义一篇,随后发布.博文上了首页,感谢博客园团队推荐,也感谢所有园友的 ...
- jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)
1.jquery data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...
- 4、DES和RSA简介
DES是分组加密算法,速度快,使用单一密钥,加密解密都使用同一个密钥,一般用于大量数据加密,目前处于半淘汰状态. RSA算法是流式加密算法,速度慢,但是使用成对的密钥,加密解密使用不同的密钥,有利于保 ...
- Ubuntu 14.04 中 安装elasticsearch2.*+logstash2.*+kibana
在Ubuntu 14.04 上安装单机版ELK 2.*(脚本化) 1.判断是否为root权限 if [ "${UID}" -ne 0 ]; then echo "You ...