SAP - ABAP - BDC详细使用

更新时间:2024-04-16 10:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

传输数据的过程

1. 2. 3. 4.

获取要传输的数据(路径+文件名+格式)

转换数据格式,使其成为系统可接受的格式(Sender Structure → Receiver Sructure) 传输 反馈

BDC

批导入是传递大批量数据到R/3的一项标准技术。其模拟事务流程传递数据,数据就像在线输入一样进行传递。该技术的优点是会执行事务的相关检查,因此可以保证数据的一致性。

批导入过程分为两步:

1. 创建一个批导入session ,其中包括所有相关的数据。 2. 处理批导入session,将其中包含的数据传入R/3系统。

数据传输工作台只执行第一步。

大多数SAP标准数据传输程序都使用的是批导入技术。数据传输程序创建一个批导入session,其在迟后一个时间处理。批导入可以以多种方式执行: ? ? ?

前台 后台

在处理过程中显示错误信息

如果想对数据传输进行检查,可以在前台处理批导入或以显示错误信息的方式执行。如果想传递数据或测试其性能,应该在后台处理。

特点分析

简单地讲BDC就是先把相应事务的处理过程录制下来,然后让系统自动执行特定的事务过程,在执行的过程中把需要传输的数据输入进去。所以可以看出BDC的优点是并不要求使用者对业务知识有多了解,只要相应的过程可以录制下来,就可以反复执行录制的过程,把数据输入系统。但BDC有一个缺点,就是输入数据时,如果项目栏的记录很多而需要换页时,不同的程序可能换页方式不同,并且不同的显示器所显示的行项目数量也不一样多,会出现执行不下去或者遗漏数据的情况,这个问题比较棘手。

获取源数据

一般情况下,在进行传输之前要把数据放入内表 ? 从系统内部获取

例如,以ALV形式输出数据后

此时,数据存放在与ALV控件相对应的内表中 ? 从系统外部获取

CALL FUNCTION’DATA_UPLOAD’

把数据由系统外部上传到ABP的内表中,这里的外部数据有严格的格式要求。如果源数据是存放在EXCEL中,需要将其另存为以Tab键格开的文本文件。

录屏

作用:录制特定事务的执行过程,得到相应事务的数据的BDCTATA格式 BDCDATA是以BDC方式进行数据传输的数据格式,如前文所说的Receiver Sructure 关于BDCDATA可以在SE11下看到系统定义的标准结构。 T_CODE:SHDB 生成代码:

录屏之后先把录制的代码保存起来,然后根据保存的代码生成BDC代码段,具体生成办法有以下2种:

? 可以把保存号的源代码导出到本地文件(一般是text文件),然后可以从该文件中

拷贝相应的代码段到特定程序。 方法:选择录屏代码→“导出”按钮 ? 也可以让系统自己生成程序代码

方法:选择录屏代码→“程序”按钮

数据转换

目的:把要输入的数据转换为BDCDATA的格式,即前面所说的Sender Structure → Receiver Sructure 方法:一般的做法是数据在进入内表之前按照相应需要一条记录占据一个内表行,然后循环内表,把内表各字段的数据赋给BDCDATA

执行

一般有两种方法可用于执行BDC:CALL TRANSACTION和CALL FUNCTION

'BDC_INSERT',其中在使用后者时候需要先打开一个SESSION,可以通过CALL FUNCTION 'BDC_OPEN_GROUP'来实现该功能。一般情况下,推荐使用前者,所以主要讲该方法。下面的例子中2和3有重复。

方法1(推荐)

CALL TRANSACTION TCODE USING BDCDATA MODE CTUMODE UPDATE CUPDATE

MESSAGES INTO MESSTAB. 参数说明:

TCODE:相应事务的事务码 MODE: A: show all dynpros

E: show dynpro on error only N: do not display dynpro

UPDATE: S: synchronously A: asynchronously L: local

MESSAGES:用于存放消息,系统中定义了一个标准的消息结构BDCMSGCOLL,用于存放消息,可在SE11低下查看该标准结构的信息。如果在调用事务时指定了该表,那么不管是否有错误,相应的消息都会进入该表。

方法2

IF SESSION = 'X'.

CALL FUNCTION 'BDC_INSERT'

EXPORTING TCODE = TCODE TABLES DYNPROTAB = BDCDATA.

方法3

IF E_GROUP_OPENED = ' '.

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING CLIENT = SY-MANDT GROUP = E_GROUP USER = E_USER KEEP = E_KEEP HOLDDATE = E_HDATE. E_GROUP_OPENED = 'X'. ENDIF.

CALL FUNCTION 'BDC_INSERT'

EXPORTING TCODE = TCODE TABLES DYNPROTAB = BDCDATA.

说明:CALL FUNCTION 'BDC_OPEN_GROUP'的作用就是为了打开一个SESSION,这一点通过比较2,3也可以看出来。

示例(操作步骤)

1. 获取源数据:

一般可通过CALL FUNCTION的方式从系统外部获取源数据

CALL FUNCTION 'WS_UPLOAD' EXPORTING

* CODEPAGE = ' ' FILENAME = P_FLNAME FILETYPE = 'DAT' * HEADLEN = ' ' * LINE_EXIT = ' ' * TRUNCLEN = ' ' * USER_FORM = ' ' * USER_PROG = ' ' * DAT_D_FORMAT = ' ' * IMPORTING

* FILELENGTH = TABLES

DATA_TAB = I_MAIN * EXCEPTIONS

* CONVERSION_ERROR = 1 * FILE_OPEN_ERROR = 2 * FILE_READ_ERROR = 3 * INVALID_TYPE = 4 * NO_BATCH = 5 * UNKNOWN_ERROR = 6 * INVALID_TABLE_WIDTH = 7 * GUI_REFUSE_FILETRANSFER = 8 * CUSTOMER_ERROR = 9 * NO_AUTHORITY = 10 * OTHERS = 11 .

IF SY-SUBRC <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.

关于FUNCTION 'WS_UPLOAD'的详细参数可在SE37低下查看。 还有一个FUNCTION 'UPLOAD'有相同的功能。 2. 录屏

第一步:进入事务记录器 T_CODE:SHDB 第二步:创建新记录

在Transaction Recorder: Recording Overview屏幕中选择‘New recording’按钮

创建新记录

第三步:命名新记录,并输入相应的事务码 其它的参数是对执行方式的详细设置,可先不考虑

给记录取名 事务码

第四步:执行相应的事务操作。

下面的执行过程与相应事务的处理相同,事务操作完成之后,系统会提示你要不要保存输入的数据,选择‘是’。

第五步:保存记录

然后系统会显示录制的源代码,选择‘保存’按钮,把新的记录保存到记录条目中去

如果在没有保存的情况下选择‘推出’,系统会提示你要不要把新的记录保存起来,选择‘是’。

第六步:生成代码段

有两种方法可用来生成代码段,第一种是让系统根据保存的记录自动生成BDC程序,方法是选择相应的记录(该记录会变成棕色),然后选择‘Program’按钮,系统会根据所选择的记录,自动生成一个Report程序,可根据该程序编写你自己的程序。

让系统用记录的条目生成一个BDC程序

或者也可以把记录中的源代码导出到本地文件。方法是双击相应的记录,显示其内容,然后选择‘导出’按钮,再按系统的要求选择存放的路径,或者需要时重新命名,这样做的好处是,输出的代码是大写的,可通过拷贝保存的代码写程序。s

导出到本地文件

3. 数据格式转换

数据转换就是把用内表存放的数据转换为BDCDATA的形式。一般可以在上载数据时,是根据情况把数据按一定的结构一条一条分别存放在内表中,然后循环内表,把内表的字段赋给BDCDATA ,录制的BDCDATA中包含一些其它的字段,这是让系统识别的,不用太注意,只需要把内表中要输入的数据赋给相应的bdc_field。

LOOP AT I_MAIN INTO W_MAIN.

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' \物料编号 I_MAIN-MATNR.

perform bdc_field using 'RMMG1-MBRSH' \行业类型 I_MATNR-MBRSH.

perform bdc_field using 'RMMG1-MTART' \物料类型 I_MATNR-MTART. perform bdc_dynpro using 'SAPLMGMM' '0070'. perform bdc_field using 'BDC_CURSOR'

'MSICHTAUSW-DYTXT(06)'. perform bdc_field using 'BDC_OKCODE' '=ENTR'.

perform bdc_field using 'MSICHTAUSW-KZSEL(01)' 'X'.

perform bdc_field using 'MSICHTAUSW-KZSEL(02)' 'X'.

perform bdc_field using 'MSICHTAUSW-KZSEL(04)' 'X'.

perform bdc_field using 'MSICHTAUSW-KZSEL(05)' 'X'.

perform bdc_field using 'MSICHTAUSW-KZSEL(06)' 'X'.

perform bdc_field using 'MSICHTAUSW-KZSEL(12)' 'X'.

perform bdc_field using 'MSICHTAUSW-KZSEL(13)' 'X'.

perform bdc_dynpro using 'SAPLMGMM' '0080'. perform bdc_field using 'BDC_CURSOR' 'RMMG1-LGORT'. perform bdc_field using 'BDC_OKCODE' 'ENTR'.

perform bdc_field using 'RMMG1-WERKS' \ I_MATNR-WERKS.

perform bdc_field using 'RMMG1-LGORT' \ I_MATNR-LGORT. perform bdc_dynpro using 'SAPLMGMM' '4000'. perform bdc_field using 'BDC_OKCODE' '/00'.

perform bdc_field using 'BDC_CURSOR' 'MAKT-MAKTX'.

perform bdc_field using 'MAKT-MAKTX' \ I_MATNR-MAKTX. perform bdc_dynpro using 'SAPLMGMM' '4000'. perform bdc_field using 'BDC_OKCODE' '/00'.

perform bdc_field using 'BDC_CURSOR' 'MAKT-MAKTX'. perform bdc_field using 'MAKT-MAKTX' 'BDC perform bdc_dynpro using 'SAPLMGMM' '4000'. perform bdc_field using 'BDC_OKCODE' '/00'.

perform bdc_field using 'MAKT-MAKTX' 'BDC perform bdc_field using 'BDC_CURSOR' 'MARC-LADGR'.

工厂 库存地点物料描述测试数据'. 测试数据'.

perform bdc_field using 'MARC-LADGR' '0001'.

perform bdc_dynpro using 'SAPLMGMM' '4000'. perform bdc_field using 'BDC_OKCODE' 'PICK'.

perform bdc_field using 'MAKT-MAKTX' 'BDC测试数据'. perform bdc_field using 'BDC_CURSOR' 'MARC-DISMM'. perform bdc_field using 'MARC-DISMM' 'M0'.

perform bdc_field using 'MARC-DISPO' '000'.

perform bdc_field using 'MARC-DISLS' '2D'.

perform bdc_dynpro using 'SAPLMGMM' '4000'. perform bdc_field using 'BDC_OKCODE' 'PICK'.

perform bdc_field using 'BDC_CURSOR' 'MAKT-MAKTX'. perform bdc_field using 'MAKT-MAKTX' 'BDC测试数据'. perform bdc_field using 'MARC-BESKZ' 'X'.

perform bdc_field using 'MARC-FHORI' '000'.

perform bdc_field using 'MARC-DZEIT' \ I_MATNR-DZEIT. perform bdc_dynpro using 'SAPLSPO1' '0300'. perform bdc_field using 'BDC_OKCODE' '=YES'. perform bdc_transaction using 'MM01'.

ENDLOOP.

4. 执行

上面的代码段中已经包含执行部分:

perform bdc_transaction using 'MM01'.

这是由于数据结构的特点适合这样处理。

另外需要注意,在执行BDC的之前要打开一个SESSION,执行完毕之后要关闭该SESSION,这是通过打开和关闭BDC_GROUP实现的。

perform open_group.

perform close_group.

相应的代码分别为 FORM OPEN_GROUP. IF SESSION = 'X'. SKIP.

WRITE: /(20) 'Create group'(I01), GROUP. SKIP.

* open batchinput group

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING CLIENT = SY-MANDT GROUP = GROUP USER = USER KEEP = KEEP

HOLDDATE = HOLDDATE. WRITE: /(30) 'BDC_OPEN_GROUP'(I02), (12) 'returncode:'(I05), SY-SUBRC. ENDIF. ENDFORM.

FORM CLOSE_GROUP. IF SESSION = 'X'.

* close batchinput group

CALL FUNCTION 'BDC_CLOSE_GROUP'. WRITE: /(30) 'BDC_CLOSE_GROUP'(I04), (12) 'returncode:'(I05), SY-SUBRC. ELSE.

IF E_GROUP_OPENED = 'X'.

CALL FUNCTION 'BDC_CLOSE_GROUP'. WRITE: /.

WRITE: /(30) 'Fehlermappe wurde erzeugt'(I06). ENDIF. ENDIF. ENDFORM.

本文来源:https://www.bwwdw.com/article/n01p.html

Top