《精编》SAP_BDC精华版教材

BDC技术介绍 首先简单解释一下BDC(Batch Data Conversion) 在SAP系统里,由于某种原因,可能需要重复输入数据,(数据不同,但是操作是相同的,典型的情形就是切换系统的时候,旧系统的数据需要导入SAP),大致过程不外乎是这样 输入一个t-code, 进入一个某个屏幕,然后输入一个值(有时还要加上一些附加的checkbox选项等),点执行或者确定按钮, 进入另一个屏幕,在某些字段输入值(也可能是标注checkbox选中或者不选中)或者修改这些字段里的值。

然后按“Eneter” 最后按“SAVE”, 一条记录完成了,继续下一条,如此循环。

上面所述的情形,如果让一个“人”来做的话,可能是真是受不了的。但是对于计算机来说,就很简单了。

SAP通过一个特殊的程序(T-codeSHDB)把用户的一次业务操作的所有过程记录下来。

从用户输入transaction code事务代码,点下“Start Recording”开始,对于用户的来说是一次普通的业务操作,但是SAP却在记录 1. 光标放到哪个字段,(在程序中不用改变) 2. 填入了什么值,(变量,循环中的Internal Table 某个字段) 3. 点击了什么按钮(在程序中不用改变) 本次操作的作为一个“代表”,是一个“模板”,告诉SAP系统以怎样的方式来执行程序,也就是用计算机的语言来描述如果手工操作的话应该是怎样的一个过程。

用BDC技术编程时,有以下几个步骤 1.把外部的数据源(Txt,Excel等)用读进internal table或者用do enddo循环。

2.在循环里,把用SHDB记录的步骤重复执行N次,(N Dialog屏幕数量)这时实际上并没行完成数据的入,系统只是在“填表”,填一个叫做“BDCData”的Internal Table。

填完bdcdata以后,用call transaction ‘XXXX’ using bdc 这个命令来真正的commit动作或者call function BDC_INSERT在建立一个session。并把执行的结果返回给messtab这个Internal Table。

现在假想一种情境,来做一个演示的BDC程序。

由于业务上的需要,某公司打算将某些物料的描述都在后面加上指定的文本Group X,所以需要修改已经存在的物料数据,用T-codeMM02, 外部数据是TXT文本,记录有N条,如下 Material NO. Description 6000-00001 XXXXXXXGroup A 2098-00001 fdfladsfladflGroup B 2059-00009 dfdsfreddfalfasfaGroup A 2003-00003 iadfdafdf,adfasfGroup D 下面是“录”操作的过程,在命令栏里输入T-code SHDB,进入如下屏幕 点New Recodring,出现如下屏幕 其中Recording 的名字是任意给的。MM02是需要录的事务代码。

按下“Start Recording”,就会进入“Change Material”,这时,以下的操作对于用户来说是一次普通修改物料描述操作,尽管系统在记录所有的操作。

输入一个物料后,点击“Select Views” 假设我们只选“Basic Data 1”和“Basic Data 1” 然后点击绿色的小勾“Enter” 我们在该物料后面添加一个“Group A”,描述改为 然后点“SAVE”,保存这次修改。

现在SAP回到了SHDB, 先点“SAVE”,保存Recording Ztest,然后点”Back”,返回SHDB的第一屏。

选中“Ztest”,然后点击“Program”,由SAP自动生成一个程序。

在上面的对话框中输入程序的名字(注意SAP的命名规范,Y或者Z开头),确认输入 再输入一些程序的属性信息如下 点击“Source Code”,指定“Develop Class”等后,就可以进入ABAP Editor,产生如下代码 report ZBDCTEST no standard page heading line-size 255. include bdcrecx1. parameters dataset132 lower case. *** DO NOT CHANGE - the generated data section - DO NOT CHANGE *** * * If it is nessesary to change the data section use the rules * 1. Each definition of a field exists of two lines * 2. The first line shows exactly the comment * * data element followed with the data element * which describes the field. * If you dont have a data element use the * comment without a data element name * 3. The second line shows the fieldname of the * structure, the fieldname must consist of * a fieldname and optional the character _ and * three numbers and the field length in brackets * 4. Each field must be type C. * *** Generated data section with specific atting - DO NOT CHANGE *** data begin of record, * data element MATNR MATNR_001018, * data element XFELD KZSEL_01_002001, * data element XFELD KZSEL_02_003001, * data element MAKTX MAKTX_004040, * data element MEINS MEINS_005003, * data element MTPOS_MARA MTPOS_MARA_006004, * data element GEWEI GEWEI_007003, end of record. *** End generated data section *** start-of-selection. per open_dataset using dataset. per open_group. do. read dataset dataset into record. if sy-subrc 0. exit. endif. per bdc_dynpro using SAPLMGMM 0060. per bdc_field using BDC_CURSOR RMMG1-MATNR. per bdc_field using BDC_OKCODE AUSW. per bdc_field using RMMG1-MATNR record-MATNR_001. per bdc_dynpro using SAPLMGMM 0070. per bdc_field using BDC_CURSOR MSICHTAUSW-DYTXT02. per bdc_field using BDC_OKCODE ENTR. per bdc_field using MSICHTAUSW-KZSEL01 record-KZSEL_01_002. per bdc_field using MSICHTAUSW-KZSEL02 record-KZSEL_02_003. per bdc_dynpro using SAPLMGMM 4004. per bdc_field using BDC_OKCODE BU. per bdc_field using BDC_CURSOR MAKT-MAKTX. per bdc_field using MAKT-MAKTX record-MAKTX_004. per bdc_field using MARA-MEINS record-MEINS_005. per bdc_field using MARA-MTPOS_MARA record-MTPOS_MARA_006. per bdc_field using MARA-GEWEI record-GEWEI_007. per bdc_transaction using MM02. enddo. per close_group. per close_dataset using dataset. 上面的程序的主要逻辑为 open dataset “读取外部数据源 do.“循环 per 填充BDCDATA子程序 per bdc_transcation endo. Close dataset. 注意上面的Incl