声明:原创作品,转载时请注明文章来自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. Github上PHP资源汇总大全,php学习的好资料

    Github上PHP资源汇总大全,php学习的好资料 国外程序员ziadoz 在Github上收集整理了PHP的各种资源,内容包括模板.框架.数据库.安全等方面的库和工具.汇总了各种PHP资源,供各位 ...

  2. 前端js,css文件合并三种方式,bat命令

    前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...

  3. tomcat启动startup.bat一闪而过 转

    遇到很多次运行startup.bat后,一个窗口一闪而过的问题,但是从来没去纠正怎样修改配置才是正确的,现在从网上查阅的资料整理如下:tomcat在启动时,会读取环境变量的信息,需要一个CATALIN ...

  4. Javascript Regexp match and replace

    # add a new article reference to database function addnewpub() { var year = $("input#year" ...

  5. ubuntu下配置java环境【转】

    转自:http://www.cnblogs.com/fnng/archive/2013/01/30/2883815.html 配置JDK环境 下载 登录oracle的网站去下载JDK7 http:// ...

  6. 2016年最好的15个Web设计和开发工具

    1.ai2html ai2html是适用于Adobe Illustrator的开源脚本,可以转换Illustrator文件为html和css. 官方网站:http://ai2html.org/ 2.A ...

  7. MongoDB C# / .NET Driver

    MongoDB C# Driver是官方提供的.NET C#驱动. Getting Started with the C# Driver C# Driver Tutorial C# Driver LI ...

  8. vim查找/替换字符串

    1.:s 命令来替换字符串. :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivia ...

  9. RabbitMQ 基本概念介绍-----转载

    1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...

  10. [OSG][转]osg格式文件

    转自:http://blog.csdn.net/timothyfly/article/details/7826139 osg格式文件中如何处理多个节点共享一个子节点 下面一段程序中,共有三个Group ...