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

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批量数据维护的更多相关文章

  1. ABAP-1-会计凭证批量数据导入本地ACCESS

    公司会计凭证导入ACCESS数据库,需要发送给审计,原先的方案是采用DEPHI开发的功能(调用函数获取会计凭证信息,然后INSERT到ACCESS数据表),运行速度非常慢,业务方要求对该功能进行优化, ...

  2. C#利用SqlDataAdapte对DataTable进行批量数据操作

    C#利用SqlDataAdapte对DataTable进行批量数据操作,可以让我们大大简化操作数据的代码量,我们几乎不需要循环和不关心用户到底是新增还是修改,更不用编写新增和修改以及删除的SQL语句, ...

  3. BSA基础数据维护

    平台 BSA基础数据维护 .扇区五个字段的内容 本来值为0,经过107上计算解析,得出正常的数值.然后106上报(200050),得到回复(200051). 查看回复数据,是否有错误.比如提示104 ...

  4. SqlServer数据维护

    现有两个表:Code和CodeCategory Code表: CodeCategory表: 现要把Code表中的数据如实维护一份数据,但是要设PlantID字段值为2,而ID要按规则自增并且要与Pla ...

  5. 《转》SQL Server 2008 数据维护实务

    SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...

  6. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  7. mysql批量数据脚本

    mysql批量数据脚本 1 建表 create table dept( id int unsigned primary key auto_increment, deptno mediumint uns ...

  8. python selenium中Excel数据维护(二)

    接着python里面的xlrd模块详解(一)中我们我们来举一个实例: 我们来举一个从Excel中读取账号和密码的例子并调用: ♦1.制作Excel我们要对以上输入的用户名和密码进行参数化,使得这些数据 ...

  9. ABAP-2-会计凭证批量数据导入本地ACCESS

    ABAP-1-会计凭证批量数据导入本地ACCESS 上一版本出现问题: A.若TXT数据条目超过800万(大概1.3G),则将TXT导入ACCESS过程不成功,ACCESS数据表为空.(Access单 ...

随机推荐

  1. android 项目学习随笔一(闪屏 )

    1.取标题栏且全屏 <activity android:name="com.ecollab.zhsh66.SplashActivity" android:label=&quo ...

  2. Android 常用工具类之 DimenUtil

    public class DimenUtil { /** sp转换成px */ public static int sp2px(float spValue) { float fontScale = M ...

  3. C#:实现托盘

    1.向窗体上添加如下控件:MenuStrip menuStrip1, NotifyIcon ni_frmMain,Timer timer1, ContentMenuStrip cms_notify.其 ...

  4. ecshop后台增加模块菜单详细教程(图)

    我们有时候针对ecshop如此开发,想在后台加一些菜单,最模板以前提供过教程,但是并非很系统,今天最模板抛砖引玉图文教程告诉大家:如何在ecshop后台增加模块菜单! 首先需要修改四个文件:inc_p ...

  5. recycleview中使用checkbox导致的重复选中问题

    参考博文:http://www.myexception.cn/mobile/1852852.html 在使用RecycleView做仿微信图片选择器,其中条目中使用了checkbox,在选中时由于ho ...

  6. Redis 安装 启动 连接 配置 重启

    Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# .tar.gz ]# cd redis- ]# ma ...

  7. hdu 1061 Rightmost Digit

    解决本题使用数学中的快速幂取余: 该方法总结挺好的:具体参考http://www.cnblogs.com/PegasusWang/archive/2013/03/13/2958150.html #in ...

  8. 文本去重之MinHash算法

    1.概述     跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHash由Andrei Broder提出,最初用于在搜索引擎中检测重复网页.它也可以应用 ...

  9. android 实现橡皮擦效果以及保存涂鸦的功能

    实现涂鸦.擦除.保存的功能 设置画笔为橡皮擦功能 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 如果你的画出来的是 ...

  10. 【20160924】GOCVHelper MFC增强算法(2)

    //创建或续写目录下的csv文件,填写“文件位置-分类”对     int writeCsv(const string& filename,const Vector<pair<st ...