how tocreate a bdc program.docx
- 文档编号:30298368
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:15
- 大小:134.41KB
how tocreate a bdc program.docx
《how tocreate a bdc program.docx》由会员分享,可在线阅读,更多相关《how tocreate a bdc program.docx(15页珍藏版)》请在冰豆网上搜索。
howtocreateabdcprogram
BDC技术
首先简单解释一下BDC(BatchDataConversion):
在SAP系统里,由于某种原因,可能需要重复输入数据,(数据不同,但是操作是相同的,典型的情形就是切换系统的时候,旧系统的数据需要导入SAP),大致过程不外乎是这样:
输入一个t-code,
进入一个某个屏幕,然后输入一个值(有时还要加上一些附加的checkbox选项等),点执行或者确定按钮,
进入另一个屏幕,在某些字段输入值(也可能是标注checkbox选中或者不选中)或者修改这些字段里的值。
然后按“Eneter”……
最后按“SAVE”……,
一条记录完成了,继续下一条,如此循环。
上面所述的情形,如果让一个“人”来做的话,可能是真是受不了的。
但是对于计算机来说,就很简单了。
SAP通过一个特殊的程序(T-code:
SHDB)把用户的一次业务操作的所有过程记录下来。
从用户输入transactioncode(事务代码),点下“StartRecording”开始,对于用户的来说是一次普通的业务操作,但是SAP却在记录:
1.光标放到哪个字段,(在程序中不用改变)
2.填入了什么值,(变量,循环中的InternalTable某个字段)
3.点击了什么按钮(在程序中不用改变)
本次操作的作为一个“代表”,是一个“模板”,告诉SAP系统以怎样的方式来执行程序,也就是用计算机的语言来描述如果手工操作的话应该是怎样的一个过程。
用BDC技术编程时,有以下几个步骤:
1.把外部的数据源(Txt,Excel等)用读进internaltable或者用doenddo循环。
2.在循环里,把用SHDB记录的步骤重复执行N次,(N=Dialog屏幕数量)这时实际上并没行完成数据的入,系统只是在“填表”,填一个叫做“BDCData”的InternalTable。
填完bdcdata以后,用calltransaction‘XXXX’usingbdc……这个命令来真正的commit动作或者callfunction'BDC_INSERT'在建立一个session。
并把执行的结果返回给messtab这个InternalTable
现在假想一种情境,来做一个演示的BDC程序。
由于业务上的需要,某公司打算将某些物料的描述都在后面加上指定的文本GroupX,所以需要修改已经存在的物料数据,用T-code:
MM02,
外部数据是TXT文本,记录有N条,如下:
MaterialNO.Description
6000-00001XXXXXXX(GroupA)
2098-00001fdfladsfladfl(GroupB)
2059-00009dfdsfreddfalfasfa(GroupA)
2003-00003iadfdafdf,adfasf(GroupD)
……
……
下面是“录”操作的过程,在命令栏里输入T-code:
SHDB,进入如下屏幕:
点NewRecodring,出现如下屏幕:
其中Recording的名字是任意给的。
MM02是需要录的事务代码。
按下“StartRecording”,就会进入“ChangeMaterial”,这时,以下的操作对于用户来说是一次普通修改物料描述操作,尽管系统在记录所有的操作。
输入一个物料后,点击“SelectView(s)”
假设我们只选“BasicData1”和“BasicData1”
然后点击绿色的小勾“Enter”
我们在该物料后面添加一个“GroupA”,描述改为:
……
然后点“SAVE”,保存这次修改。
现在SAP回到了SHDB,
先点“SAVE”,保存Recording:
Ztest,然后点”Back”,返回SHDB的第一屏。
选中“Ztest”,然后点击“Program”,由SAP自动生成一个程序。
在上面的对话框中输入程序的名字(注意SAP的命名规范,Y或者Z开头),确认输入
再输入一些程序的属性信息如下:
点击“SourceCode”,指定“DevelopClass”等后,就可以进入ABAPEditor,产生如下代码:
reportZBDCTEST
nostandardpageheadingline-size255.
includebdcrecx1.
parameters:
dataset(132)lowercase.
***DONOTCHANGE-thegenerateddatasection-DONOTCHANGE***
*
*Ifitisnessesarytochangethedatasectionusetherules:
*1.)Eachdefinitionofafieldexistsoftwolines
*2.)Thefirstlineshowsexactlythecomment
*'*dataelement:
'followedwiththedataelement
*whichdescribesthefield.
*Ifyoudon'thaveadataelementusethe
*commentwithoutadataelementname
*3.)Thesecondlineshowsthefieldnameofthe
*structure,thefieldnamemustconsistof
*afieldnameandoptionalthecharacter'_'and
*threenumbersandthefieldlengthinbrackets
*4.)EachfieldmustbetypeC.
*
***Generateddatasectionwithspecificformatting-DONOTCHANGE***
data:
beginofrecord,
*dataelement:
MATNR
MATNR_001(018),
*dataelement:
XFELD
KZSEL_01_002(001),
*dataelement:
XFELD
KZSEL_02_003(001),
*dataelement:
MAKTX
MAKTX_004(040),
*dataelement:
MEINS
MEINS_005(003),
*dataelement:
MTPOS_MARA
MTPOS_MARA_006(004),
*dataelement:
GEWEI
GEWEI_007(003),
endofrecord.
***Endgenerateddatasection***
start-of-selection.
performopen_datasetusingdataset.
performopen_group.
do.
readdatasetdatasetintorecord.
ifsy-subrc<>0.exit.endif.
performbdc_dynprousing'SAPLMGMM''0060'.
performbdc_fieldusing'BDC_CURSOR'
'RMMG1-MATNR'.
performbdc_fieldusing'BDC_OKCODE'
'=AUSW'.
performbdc_fieldusing'RMMG1-MATNR'
record-MATNR_001.
performbdc_dynprousing'SAPLMGMM''0070'.
performbdc_fieldusing'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
performbdc_fieldusing'BDC_OKCODE'
'=ENTR'.
performbdc_fieldusing'MSICHTAUSW-KZSEL(01)'
record-KZSEL_01_002.
performbdc_fieldusing'MSICHTAUSW-KZSEL(02)'
record-KZSEL_02_003.
performbdc_dynprousing'SAPLMGMM''4004'.
performbdc_fieldusing'BDC_OKCODE'
'=BU'.
performbdc_fieldusing'BDC_CURSOR'
'MAKT-MAKTX'.
performbdc_fieldusing'MAKT-MAKTX'
record-MAKTX_004.
performbdc_fieldusing'MARA-MEINS'
record-MEINS_005.
performbdc_fieldusing'MARA-MTPOS_MARA'
record-MTPOS_MARA_006.
performbdc_fieldusing'MARA-GEWEI'
record-GEWEI_007.
performbdc_transactionusing'MM02'.
enddo.
performclose_group.
performclose_datasetusingdataset.
上面的程序的主要逻辑为:
opendataset“读取外部数据源
do.“循环
perform填充BDCDATA子程序
performbdc_transcation
endo.
Closedataset.
注意上面的Include程序里有两个重要的form.
*-------------------------------------------------------------------*
*Startnewscreen*
*-------------------------------------------------------------------*
formbdc_dynprousingprogramdynpro.
clearbdcdata.
bdcdata-program=program.
bdcdata-dynpro=dynpro.
bdcdata-dynbegin='X'.
appendbdcdata.
endform.
*-------------------------------------------------------------------*
*Insertfield*
*-------------------------------------------------------------------*
formbdc_fieldusingfnamfval.
iffval<>nodata.
clearbdcdata.
bdcdata-fnam=fnam.
bdcdata-fval=fval.
appendbdcdata.
endif.
endform.
另外还有两个重要的internaltable声明。
bdcdata及messtab
*Batchinputdataofsingletransaction
data:
bdcdatalikebdcdataoccurs0withheaderline.
*messagesofcalltransaction
data:
messtablikebdcmsgcolloccurs0withheaderline.
选取部分最关键(典型)的代码如下:
do.
readdatasetdatasetintorecord.“逐行读出txt文本中的记录,
请参:
readdataset
ifsy-subrc<>0.exit.endif.“如出错就退出
以下执行子程序(粗斜体部分)
屏幕
A、指定bdc_dynpro的实参,告知系统dialog程序名称:
SAPLMGMM,及screennumber:
0060
performbdc_dynprousing'SAPLMGMM''0060'.
B、指定bdc_field的实参,告知系统把光标放在哪个字段,这里是“RMMG1-MATNR,物料”
performbdc_fieldusing'BDC_CURSOR'
'RMMG1-MATNR'.
C、告知系统ok_code是什么,也可以认为是去点哪个按钮,这里是左上角的“SelectView(s)”
performbdc_fieldusing'BDC_OKCODE'
'=AUSW'.
这里是通过readdataset读取的外部的文件中的记录,record是一个用于临时保存数据的仅有一行的workarea。
程序在运行进,record-matnr_001应该是一个具体的物料代码。
performbdc_fieldusing'RMMG1-MATNR'
record-MATNR_001.
屏幕
是类似的
performbdc_dynprousing'SAPLMGMM''0070'.
performbdc_fieldusing'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
performbdc_fieldusing'BDC_OKCODE'
'=ENTR'.
performbdc_fieldusing'MSICHTAUSW-KZSEL(01)'
record-KZSEL_01_002.
performbdc_fieldusing'MSICHTAUSW-KZSEL(02)'
record-KZSEL_02_003.
同样先指定程序名称及屏幕号,然后指定光标位置,值,OK_Code
performbdc_dynprousing'SAPLMGMM''4004'.
performbdc_fieldusing'BDC_OKCODE'
'=BU'.
performbdc_fieldusing'BDC_CURSOR'
'MAKT-MAKTX'.
performbdc_fieldusing'MAKT-MAKTX'
record-MAKTX_004.
performbdc_fieldusing'MARA-MEINS'
record-MEINS_005.
performbdc_fieldusing'MARA-MTPOS_MARA'
record-MTPOS_MARA_006.
performbdc_fieldusing'MARA-GEWEI'
record-GEWEI_007.
以上的步骤实际上在一个叫做bdcdata的internaltable中填入了一些关于调用哪个程序(包括屏幕号码),在哪些字段中,填入什么值,点击什么按钮等信息。
下面的一个步骤才真正的向系统写入数据
callfunction'BDC_INSERT',建立session,一般是后台运行,能给出Log信息
或
calltransaction不建立session,直接执行。
执行后返回的消息保存在messtab中。
performbdc_transactionusing'MM02'.
enddo.
performclose_group.
performclose_datasetusingdataset.
再给一个简明的非SAP自动生成的程序如下(旧版SAP31I),这个程序略去了读取外部数据的程序,没有用循环,只是用Matnr从屏幕上接收用户输入的一个物料。
REPORTZBDC1.
TABLES:
MARA.
DATA:
BEGINOFBDCDATAOCCURS0.
INCLUDESTRUCTUREBDCDATA.
DATA:
ENDOFBDCDATA.
PARAMETERS:
MATNRLIKEMARA-MATNR.
PARAMETERS:
P_MODETYPECDEFAULT'N'.
START-OF-SELECTION.
PERFORMPROCESS_CC02.
PERFORMPROCESS_CC03.
PERFORMPROCESS_CC04.
PERFORMPROCESS_CC05.
CALLTRANSACTION'MM02'USINGBDCDATAMODEP_MODEUPDATE'S'.
END-OF-SELECTION.
FORMPROCESS_CC02.
PERFORMBDC_DYNPROUSING'SAPLMGMM''0060'.
PERFORMBDC_FIELDUSING'BDC_OKCODE''/00'.
PERFORMBDC_FIELDUSING'RMMG1-MATNR'MATNR.
ENDFORM."process_cc02
FORMPROCESS_CC03.
PERFORMBDC_DYNPROUSING'SAPLMGMM''0070'.
PERFORMBDC_FIELDUSING'BDC_OKCODE''ENTR'.
PERFORMBDC_FIELDUSING'MSICHTAUSW-KZSEL(11)''X'.
ENDFORM."process_cc03
FORMPROCESS_CC04.
PERFORMBDC_DYNPROUSING'SAPLMGMM''0080'.
PERFORMBDC_FIELDUSING'BDC_OKCODE''ENTR'.
PERFORMBDC_FIELDUSING'RMMG1-WERKS''TH10'.
ENDFORM."process_cc04
FORMPROCESS_CC05.
PERFORMBDC_DYNPROUSING'SAPLMGMM''3000'.
PERFORMBDC_FIELDUSING'BDC_OKCODE''BU'.
ENDFORM."process_cc05
FORMBDC_DYNPROUSINGPROGRAMDYNPRO.
CLEARBDCDATA.
BDCDATA-PROGRAM=PROGRAM.
BDCDATA-DYNPRO=DYNPRO.
BDCDATA-DYNBEGIN='X'.
APPENDBDCDATA.
ENDFORM.
FORMBDC_FIELDUSINGFNAMFVAL.
CLEARBDCDATA.
BDCDATA-FNAM=FNAM.
BDCDATA-FVAL=FVAL.
APPENDBDCDATA.
ENDFORM.
总结一下:
对于一个BDC程序来说,
有两个固定的internaltable需要声明:
bdcdata和messtab,名称可以变,但是声明时一定要
*Batchinputdataofsingletransaction
data:
abclikebdcdataoccurs0withheaderline.
*messagesofcalltransaction
data:
deflikebdcmsgcolloccurs0withheaderline.
Like后面的tabletype(这里是一个structure)是不能改变的。
有两个固定功能的form:
bdc_dynapro和bdc_field
名称同样是任意的,但是程序代码应该是相同的,
(强烈建议不要改动,因为会给自己添加麻烦)
另个还有一个InternalTable或者workarea是用来放从外部读进来的数据的,结构应该和你的外部文件的有相关的字段结构。
一次读进全部的记录然后循环处理loopat[internaltable]……process……endloop。
或者一条一条读进并处理,然后循环读下一条do……process……enddo。
其中Process分为两个部分:
1.填充bdcdata表。
2.CalltransactionorCallFunction‘BDC_Inser’返回消息放入Messtab.
另外有一个经验之谈:
1、录“操作”的时候,不要有“多余”的操作,(什么是多余的操作?
自己思考吧)如果有,就重新录吧,不然这些操作也被记录下来,程序每次都要做一些不必要的动作。
2、尽量用鼠标去点击按钮,而不要只是敲“Enter”。
3、光标的位置一般也可以不指定,也就是performbdc_fieldusing‘BDC_CURSOR’‘XXXX-XXXX’通常可以不用写。
不过,据说有时候去了也会出问题,加上去就没了,这个我就不知道了。
呵~
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- how to create bdc program