SAP BDC

SAP BDC(批量数据转换)是一种自动化数据输入的方法,用于减轻重复性的人工操作。通过SHDB程序记录用户操作,形成模板,然后通过ABAP程序实现对TXT或Excel数据源的读取,并按照模板批量修改SAP系统中的数据。本文详细介绍了如何使用BDC技术,包括数据读取、BDCData填充、事务代码调用等步骤,以修改物料描述为例展示了BDC程序的创建过程。
摘要由CSDN通过智能技术生成

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

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

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

从用户输入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-code:MM02,

外部数据是TXT文本,记录有N条,如下:

Material NO.     Description
6000-00001      XXXXXXX(Group A)
2098-00001      fdfladsfladfl(Group B )
2059-00009      dfdsfreddfalfasfa(Group A)
2003-00003      iadfdafdf,adfasf(Group D)
……
……
下面是“录”操作的过程,在命令栏里输入T-code :SHDB,进入如下屏幕:

 点New Recodring,出现如下屏幕:

其中Recording 的名字是任意给的。MM02是需要录的事务代码。

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


输入一个物料后,点击“Select View(s)”

 

假设我们只选“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: dataset(132) 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 don't 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 formatting - DO NOT CHANGE  ***
data: begin of record,
* data element: MATNR
       MATNR_001(018),
* data element: XFELD
       KZSEL_01_002(001),
* data element: XFELD
       KZSEL_02_003(001),
* data element: MAKTX
       MAKTX_004(040),
* data element: MEINS
       MEINS_005(003),
* data element: MTPOS_MARA
       MTPOS_MARA_006(004),
* data element: GEWEI
       GEWEI_007(003),
     end of record.

*** End generated data section ***

start-of-selection.

perform open_dataset using dataset.
perform open_group.

do.

read dataset dataset into record.
if sy-subrc <> 0. exit. endif.

perform bdc_dynpro      using 'SAPLMGMM' '0060'.
perform bdc_field       using 'BDC_CURSOR'
                             'RMMG1-MATNR'.
perform bdc_field       using 'BDC_OKCODE'
                             '=AUSW'.
perform bdc_field       using 'RMMG1-MATNR'
                             record-MATNR_001.
perform bdc_dynpro      using 'SAPLMGMM' '0070'.
perform bdc_field       using 'BDC_CURSOR'
                             'MSICHTAUSW-DYTXT(02)'.
perform bdc_field       using 'BDC_OKCODE'
                             '=ENTR'.
perform bdc_field       using 'MSICHTAUSW-KZSEL(01)'
                             record-KZSEL_01_002.
perform bdc_field       using 'MSICHTAUSW-KZSEL(02)'
                             record-KZSEL_02_003.
perform bdc_dynpro      using 'SAPLMGMM' '4004'.
perform bdc_field       using 'BDC_OKCODE'
                             '=BU'.
perform bdc_field       using 'BDC_CURSOR'
                             'MAKT-MAKTX'.
perform bdc_field       using 'MAKT-MAKTX'
                             record-MAKTX_004.
perform bdc_field       using 'MARA-MEINS'
                             record-MEINS_005.
perform bdc_field       using 'MARA-MTPOS_MARA'
                             record-MTPOS_MARA_006.
perform bdc_field       using 'MARA-GEWEI'
                             record-GEWEI_007.
perform bdc_transaction using 'MM02'.

enddo.

perform close_group.
perform close_dataset using dataset.

上面的程序的主要逻辑为:

open dataset “读取外部数据源

do.“循环
 
 perform 填充BDCDATA子程序
 perform bdc_transcation

endo.

Close dataset.

注意上面的Include程序里有两个重要的form.

*-------------------------------------------------------------------*
*        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                                              

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值