BDC、CATT批量数据维护
![](http://images.cnblogs.com/cnblogs_com/jiangzhengjun/655614/o_%E7%BB%BF2.gif)
BDC批量数据导入
BDC(Batch Data Communication),是SAP系统数据传输的主要技术之一,主要用于把数据大量大批输入到SAP系统。
BDC方法与ABAP编程的关系密切,因此相对于LSMW、CATT等其他数据传输方式,BDC方法更灵活。
BDC是模拟屏幕操作(与按键精灵相似),记录相关屏幕出现顺序和处理过程,产生数据录入的格式文件,通过调整数据文件后,再运行BDC产生ABAP程序,最后可能生成的ABAP程序进行修改,得到最终的数据录入代码片断
SM35(包含SHDB)录屏操作
该界面列出了所有通过BDC所执行的会话记录:
单击按钮,进行SHDB屏幕录制界面:
输入事务码AS02后,点击“开始记录”按钮,将会跳到AS02维护界面:
保存数据后,生成记录:
如果是触发PAI事件,则会使用 BDC_OKCODE 的字段来存储相应的FunctonCode
从生成的录屏记录来看,不能确认界面上哪些字段会被录入,哪些字段不会被录入:没输入的(“次级编号”)有的录了,但有的又没录上(“数量”等等没输入就没录进),但可以肯定一点的是不能编辑的输入框是不会被录入的。所以哪些录入哪些不录入,并没有找到规则。
生成程序
带服务器端测试数据文件
运行生成的报表程序如下:
. EXIT. ENDIF.
PERFORM bdc_dynpro USING 'SAPLAIST' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ANLA-BUKRS'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'ANLA-ANLN1'
record-anln1_001.
PERFORM bdc_field USING 'ANLA-ANLN2'
record-anln2_002.
PERFORM bdc_field USING 'ANLA-BUKRS'
record-bukrs_003.
PERFORM bdc_dynpro USING 'SAPLAIST' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BUCH'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ANLA-TXT50'.
PERFORM bdc_field USING 'ANLA-TXT50'
record-txt50_004.
PERFORM bdc_field USING 'ANLH-ANLHTXT'
record-anlhtxt_005.
PERFORM bdc_field USING 'ANLA-AKTIV'
record-aktiv_006.
"该Form实际上就是通过下面语句来实现的,同时包括了对运行
"过程中产生的消息进行了处理,调用该Form时不需要再对消息
"进行额外的处理。客制化(如消息状态以红绿灯方式来显示)消息处理可以参考《ABAP Practical Example App.docx》文档
* CALL TRANSACTION TCODE USING BDCDATA
* MODE CTUMODE
* UPDATE CUPDATE
* MESSAGES INTO MESSTAB.
PERFORM bdc_transaction USING 'AS02'.
ENDDO.
PERFORM close_group.
PERFORM close_dataset USING dataset."关闭文件
编辑服务器端上生成的测试数据文件
上一节生成的程序过程,选择了生成测试文件,该文件存入在服务器上。下面介绍如何查看SAP应用服务器上所生的文件信息。
在SM35界面上,点击会输入SHDB,在SHDB操作界面,打开文件监视器:
SAP会为每个文件夹存放的路径定义一个“目录参数的名称”,如用户所创建的文件存放在SAP应用服务器的“DIR_SAPUSERS”下:
双击即可看到该目录下的所有文件,如本例中创建的“AS02_FILE”:
双击该文件,即可查看该文件的内容,内容就是上面录屏时界面上录入的数据:
可以通过SAP提供的工具CG3Y,将此文件下载到本地后进行编辑:
修改好后,再通过工具CG3Z将文件上传到服务器上:
将文件上传到服务器上后,可以将录入程序在后台运行,适合于大批量需要耗时较长的数据处理。
CG3Y、CG3Z文件每行字符超长问题
CG3YDOWNLOAD服务器文件(如果是ASC模式下载,每行只能256个字符,解决方案是函数C13Z_FILE_DOWNLOAD_ASCII的L_DATA_TAB改为TYPE STRING)
CG3ZUPLOAD本地文件到服务器中(如果是ASC模式上传,每行只能256个字符,解决方案是函数C13Z_FILE_UPLOAD_ASCII的L_DATA_TAB改为TYPE STRING)
不带测试数据文件
如果在生成代码时选择的是“从记录中传输”,则生成的代码非常简单,但较之上面需要修改很多才能使用:
.
INCLUDE bdcrecx1.
START-OF-SELECTION.
PERFORM open_group.
PERFORM bdc_dynpro USING 'SAPLAIST' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ANLA-ANLN1'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'ANLA-ANLN1'
'11000001'.
PERFORM bdc_field USING 'ANLA-ANLN2'
'0'.
PERFORM bdc_field USING 'ANLA-BUKRS'
'0005'.
PERFORM bdc_dynpro USING 'SAPLAIST' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BUCH'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ANLA-TXT50'.
PERFORM bdc_field USING 'ANLA-TXT50'
'AAA'.
PERFORM bdc_field USING 'ANLH-ANLHTXT'
'BBB'.
PERFORM bdc_field USING 'ANLA-AKTIV'
'2006.04.19'.
PERFORM bdc_transaction USING 'AS02'.
PERFORM close_group.
从本地读取测试数据文件
从前面生成的程序来看,引用了系统标准的Include程序bdcrecx1,这里可以将BDC处理的核心代码拷贝出来,如存放到一个自定义的Include文件zbdcrecx1中,自定义程序中不再考虑DataSet及BDC Group的方法,主要需要拷贝的内表定义包括BDCDATA、MESSTAB;需要拷贝的Form如下:
精简后的Include文件zbdcrecx1:
).
DATA: l_subrc LIKE sy-subrc.
A:代表无论出错与否每个画面都显示;
E:只是在出错时显示;
N:代表无论出错与否每个画面都不显示。
).
ELSE.
WRITE: / messtab.
ENDIF.
ENDLOOP.
REFRESH bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM.
新创建一个XLS文件,并输入测试数据:
),
END OF record.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file."选择文件时弹出选择对话框
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE'
IMPORTING
file_name = p_file.
START-OF-SELECTION.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X' "表示测试文件的第一行为头,从第二行开始读取
i_tab_raw_data = it_raw
i_filename = p_file
TABLES
i_tab_converted_data = record[].
CHECK NOT record[] IS INITIAL.
LOOP AT record.
PERFORM bdc_dynpro USING 'SAPLAIST' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ANLA-BUKRS'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'ANLA-ANLN1'
record-anln1_001.
PERFORM bdc_field USING 'ANLA-BUKRS'
record-bukrs_002.
PERFORM bdc_dynpro USING 'SAPLAIST' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BUCH'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ANLH-ANLHTXT'.
PERFORM bdc_field USING 'ANLA-TXT50'
record-txt50_003.
PERFORM bdc_field USING 'ANLH-ANLHTXT'
record-anlhtxt_004.
PERFORM bdc_transaction USING 'AS02' 'E'.
ENDLOOP.
BDC后台运行
先贴上,以后研究
BDC(batch data communication)是SAP常用的一种数据传输方法。用于一些数据量大,但是对速度又要求不高的数据传输。
在实施中,很多开发顾问都忽略了BDC的日志和出错管理。这给用户在使用中带来了很大的不便。比如:哪些数据是成功生成的,哪些是失败的?那些失败的,原因的是什么?程序问题还是数据问题?
我觉得,既然是要做一套程序,那就应该尽可能地为客户考虑,减少日后的维护量。对于BDC程序来讲,日志和出错管理应该是必备的。
下面讲一下,BDC的两种通用写法。
1. Call Transaction: 顾名思义,就是直接调用BDC进行数据批量导入。优点:方便快捷,程序处理方便。缺点:日志管理能力差,需自己建透明表来维护数据。我只是把它用作测试用途,不做正式使用。
2. BDC Insert(即CALL Function):这是一种不直接运行,而是将BDC程序生成session(但不立即运行,需要手工或通过RSBDCSUB专用程序来运行会话)。优点:通过T-code 来说实现起来比较繁琐。我主要是用这种方法来实现BDC功能。
下面主要来谈一下BDC Insert这种方法。
1. 需要在程序中调用 function 'BDC_INSERT'来把BDCDATA生成SESSION.
2. 通过程序RSBDCSUB来执行SESSION(后续建立JOB中使用,目前手动运行会话)
3. 建立BATCH JOB来定期执行RSBDCSUB,从而实现SESSION自动执行的目的
4. 当然,不使用程序RSBDCSUB和JOB,每次手工在SM35中执行SESSION也是可以的
下面是我写的一个实例:
, . .. . . ) ) ) ) ),
GV_C_ULINE() ) () .
) .
NO_BATCH =
SELECTION_CANCEL =
SELECTION_ERROR =
.
FILE_OPEN_ERROR =
FILE_READ_ERROR =
INVALID_TABLE_WIDTH =
INVALID_TYPE =
NO_BATCH =
UNKNOWN_ERROR =
.
.
.
.
.
.
.
.
.
.
() = () = P_MSGV1.
GT_IMESG-MSGV2 = P_MSGV2.
GT_IMESG-MSGV3 = P_MSGV3.
GT_IMESG-MSGV4 = P_MSGV4.
APPEND GT_IMESG.
CONCATENATE P_MSGV1 P_MSGV2 P_MSGV3 P_MSGV4
INTO GV_C170 SEPARATED BY SPACE.
WRITE:/ GV_C170.
ENDFORM.
通过RSBDCSUB运行会话
destination_invalid
group_invalid
group_is_locked
holddate_invalid
internal_error
queue_error
running
system_lock_error
user_invalid
not_open
queue_error
tcode_invalid
printing_invalid
posting_invalid
queue_error
.
ENDLOOP.
ENDFORM. " WRITE_ERROR
CATT批量数据维护(SCAT、SCEM)
CATT 全称 Computer Aided Test Tool(计算机辅助测试工具),也是批量数据维护工具。与BDC类似的是,CATT的数据操作也是通过录制屏幕的方式来实现的,但是有自己的优势:
l BDC导入本地数据需要通过辅助开发程序来实现,而CATT则可以直接读取本地文件;
l BDC读取文件到内存后再进行处理,可以方便地通过ABAP代码来实现数据的检查或者转换,但是CATT则是比较直接的数据录入,相比之下,BDC的控制会更加灵活。
l CATT操作简单,可以由模块顾问录制好后再提供给用户直接使用,只需要用户按顾问提供的测试数据模板文件提供数据即可
若是基本的数据录入或修改的话,CATT实现起来会更加的简单
本实例还是以修改资产主数据事务AS02为例来演示
因AS02属于账务控制模块,所以选择C0:
点击“保存”按钮后,再修改“类型”为“C CATT”类型(注:如果不先保存,直接选 C CATT 时会报错):
保存后,再输入SCEM事务码,操作界面与SCAT基本类似:
点击“记录”按钮后,就是AS02事务操作界面了:
与上面BDC中的示例一样,修改后保存,会回到SCEM界面,此时记录框中有了“结束并复制”按钮:
点击“结束并复制”按钮后,将会看到测试界面修改界面,左边菜单项中为录制过程中的屏幕及操作的消息输出(这里为第三项):
单击字段检查按钮,会在右边屏幕上增加工具条:
SCEM操作完后,保存所有,然后再回到SCAT界面,并执行“导出”,将会导出本地数据录入模板:
导入的文件为Txt文件,可以使用Excel打开进行维护,新增的数据必须按文件中的位置来填写:
测试文件修改好后,进入执行界面:
执行后,输出日志:
BDC、CATT批量数据维护的更多相关文章
- ABAP-1-会计凭证批量数据导入本地ACCESS
公司会计凭证导入ACCESS数据库,需要发送给审计,原先的方案是采用DEPHI开发的功能(调用函数获取会计凭证信息,然后INSERT到ACCESS数据表),运行速度非常慢,业务方要求对该功能进行优化, ...
- C#利用SqlDataAdapte对DataTable进行批量数据操作
C#利用SqlDataAdapte对DataTable进行批量数据操作,可以让我们大大简化操作数据的代码量,我们几乎不需要循环和不关心用户到底是新增还是修改,更不用编写新增和修改以及删除的SQL语句, ...
- BSA基础数据维护
平台 BSA基础数据维护 .扇区五个字段的内容 本来值为0,经过107上计算解析,得出正常的数值.然后106上报(200050),得到回复(200051). 查看回复数据,是否有错误.比如提示104 ...
- SqlServer数据维护
现有两个表:Code和CodeCategory Code表: CodeCategory表: 现要把Code表中的数据如实维护一份数据,但是要设PlantID字段值为2,而ID要按规则自增并且要与Pla ...
- 《转》SQL Server 2008 数据维护实务
SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...
- 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作
4.4 从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...
- mysql批量数据脚本
mysql批量数据脚本 1 建表 create table dept( id int unsigned primary key auto_increment, deptno mediumint uns ...
- python selenium中Excel数据维护(二)
接着python里面的xlrd模块详解(一)中我们我们来举一个实例: 我们来举一个从Excel中读取账号和密码的例子并调用: ♦1.制作Excel我们要对以上输入的用户名和密码进行参数化,使得这些数据 ...
- ABAP-2-会计凭证批量数据导入本地ACCESS
ABAP-1-会计凭证批量数据导入本地ACCESS 上一版本出现问题: A.若TXT数据条目超过800万(大概1.3G),则将TXT导入ACCESS过程不成功,ACCESS数据表为空.(Access单 ...
随机推荐
- 新发现了一个编辑器HBuilder,感觉蛮好的,关键是国产软件。
http://www.dcloud.io/
- 个人的java web开发书单
首发至个人博客http://www.zidafone.com/blog/36 以下是对一些读过的书和一些买后随便翻了翻的书的个人感觉.都是java web开发的程序员可能接触的书,其他的如设计/手机开 ...
- 原生js获取execl里面的值 主要使用ActiveXObject
今天一个程序员给了一个excel表,里面有一百多条数据,叫我一个一个数据的复制到系相应的函数里面比如 put("gaga1","gaga2"),这样一句话,要我 ...
- 去除冗余 – 精简您的CSS样式代码
讲讲常见的一些没有必要使用CSS代码情况,而这些不起作用可以去掉的CSS代码可能是我们经常忽视的.越是对CSS理解不够,越容易出现这些问题. 二.一些常见不必要CSS样式 1.与默认CSS样式一致 我 ...
- PHP判断客户端是PC web端还是移动手机端方法
PHP判断客户端是PC web端还是移动手机端方法需要实现:判断手机版的内容加上!c550x260.jpg后缀变成缩略图PHP用正则批量替换Img中src内容,用正则表达式获取图片路径实现缩略图功能 ...
- Android 常用工具类之SPUtil,可以修改默认sp文件的路径
参考: 1. 利用Java反射机制改变SharedPreferences存储路径 Singleton1900 2. Android快速开发系列 10个常用工具类 Hongyang import ...
- Java中删除指定文件夹文件夹下面有内容也删除使用递归方案
import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java ...
- GCD 多线程同步
@property (strong, nonatomic) dispatch_queue_t barrierQueue; _barrieQueue = dispatch_queue_create(&q ...
- 新学习的语言Groovy
什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...
- python测试代理IP地址
代码: # -*- coding: utf-8 -*- import urllib,urllib2,re from random import choice from scrapy.selector ...