BDC(batch data communication)是SAP常用的一种数据传输方法。用于一些数据量大,但是对速度又要求不高的数据传输。
在实施中,很多开发顾问都忽略了BDC的日志和出错管理。这给用户在使用中带来了很大的不便。比如:哪些数据是成功生成的,哪些是失败的?那些失败的,原因的是什么?程序问题还是数据问题?
我觉得,既然是要做一套程序,那就应该尽可能地为客户考虑,减少日后的维护量。对于BDC程序来讲,日志和出错管理应该是必备的。
下面讲一下,BDC的两种通用写法。
1. Call Transaction: 顾名思义,就是直接调用BDC进行数据批量导入。优点:方便快捷,程序处理方便。缺点:日志管理能力差,需自己建透明表来维护数据。我只是把它用作测试用途,不做正式使用。
2. BDC Insert:这是一种不直接运行,而是将BDC程序生成session,间接运行的一种方法。优点:通过T-code SM35可以进行运行管理及日志管理,方便查错。缺点:相对方法1来说实现起来比较繁琐。我主要是用这种方法来实现BDC功能。
下面主要来谈一下BDC Insert这种方法。
1. 需要在程序中调用 function 'BDC_INSERT'来把BDCDATA生成SESSION.
2. 程序RSBDCSUB是执行SESSION的专用程序,要建立相应的VARIANT,后续建立JOB中使用
3. 建立BATCH JOB来定期执行RSBDCSUB,从而实现,SESSION自动执行的目的
4. 当然,不使用程序RSBDCSUB和JOB,每次手工在SM35中执行SESSION也是可以的
下面是我写的一个实例:
* Program Name: Z_KEVIN_ADV_BDC
* Author : Kevin.Zhang
* Module : N/A
*
*
*
*----------------------------------------------------------------------*
* Author Date Commented as Description
*
REPORT*$*$----------------------------------------------------------------$*$*
*$*$----------------------------------------------------------------$*$*
* Tables
TABLES*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
: GT_TABLE , <font color="gray" face=""">"internal order table
LIKE"order type
LIKE"order number
LIKE"description
LIKE"company code
LIKE"business area
LIKE"profit center
LIKE"function area
ENDOFDATABEGINOFOCCURS0"existed IO
INCLUDESTRUCTUREDATAENDOFDATABEGINOFOCCURS0"the profit center not existing IO
INCLUDESTRUCTUREDATAENDOFDATABEGINOFOCCURS0"the submitted IO
INCLUDESTRUCTUREDATAENDOFDATABEGINOFOCCURS0"BDC DATA
INCLUDESTRUCTUREDATAENDOFDATABEGINOFOCCURS10"message table
INCLUDESTRUCTUREDATAENDOFDATALIKEOCCURS0WITHHEADERLINE*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
: GV_GROUP() , <font color="gray" face=""">"BDC Name
12TYPEC"BDC User
1TYPECVALUE'X'" ' '=Delete,'X'=keep after processing
LIKE"Date
: GV_FLAG() ,
TYPEI"number of orders
: GV_C170(),
50VALUE'__________________________________________________'*$*$----------------------------------------------------------------$*$*
*$*$----------------------------------------------------------------$*$*
* Selection Screen
PARAMETERS1TYPECDEFAULT'B'NO BDCMODE BDCRUN-BDC_AMODUS -DISPLAY.
SCREENCOMMENT1070TEXT001PARAMETERS128DEFAULT'C:/TEMP/*.txt'SELECTION- .
* At Selection Screen
*--------- AT SELECTION-SCREEN ON VALUE-REQUEST ----------
SELECTION- -REQUEST IN_FILE.
CALLFUNCTION'WS_FILENAME_GET'
EXPORTING
'*.txt'
'C:/DATA'
MASK',All Files,*.*,Text Files,*.txt;*.doc.'
MODE'O'
TITLE'Please choose file to use '
IMPORTING
INV_WINSYS = NO_BATCH = SELECTION_CANCEL = SELECTION_ERROR = = .
*$*$ Main Program $*$*
*--------- START-OF-SELECTION ----------
OF GT_TABLE.
FILENAME = IN_FILE
'DAT'
TABLES
CONVERSION_ERROR = FILE_OPEN_ERROR = FILE_READ_ERROR = INVALID_TABLE_WIDTH = INVALID_TYPE = NO_BATCH = UNKNOWN_ERROR = = .
IF0 COLLECT_MESSAGES IN_FILE .
ENDIF GT_TABLE AUFNR GSBER .
DELETEADJACENTDUPLICATESFROMCOMPARING OPEN_GROUP.
PERFORM BDC_CLOSE_GROUP.
PERFORM*--------- END-OF-SELECTION ----------
*$*$ Subroutines $*$*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* <-- p2 text
FORM GV_USER = SY-UNAME.
CALLFUNCTION'BDC_OPEN_GROUP'
EXPORTING
CLIENT = GV_GROUP
KEEP = GV_KEEP
SY-SUBRC <> .
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIFENDFORM" OPEN_GROUP
*& Form FILL_BDC_DATA
* text
* --> p1 text
*----------------------------------------------------------------------*
FILL_BDC_DATA.
CLEAR GT_TABLE.
CLEAR GT_BDCDATA.
REFRESH GT_MESSTAB.
CLEAR* Check if Profit Center exists.
SELECTSINGLEFROM PRCTR = GT_TABLE-PRCTR.
IF0 GT_PRFT_CNTR.
MOVETO GT_PRFT_CNTR.
'X' .
* COAS
WHERE SY-SUBRC = .
CLEAR -CORRESPONDING GT_TABLE GT_EXISTS.
APPEND GV_FLAG = .
ENDIF GV_FLAG <> .
PERFORMUSING'X''SAPMKAUF''0100'"order type
' ''COAS-AUART' .
PERFORMUSING'X''SAPLSPO4''0300'"control area
' ''SVALD-VALUE(01)''1000' .
PERFORMUSING'X''SAPMKAUF''0100'"ok code
' ''BDC_OKCODE''/00' BDCDATA : , <font color="gray" face=""">"order master data
' ''COAS-AUFNR' GT_TABLE-KTEXT,
' ''COAS-BUKRS' GT_TABLE-GSBER,
' ''COAS-PRCTR' GT_TABLE-FUNCA,
' ''BDC_OKCODE''=SICH'* PERFORM CALL_TRANSACTION. "for test purpose
PERFORM -CORRESPONDING GT_TABLE GT_SUBMIT.
APPEND .
ENDLOOPENDFORM" FILL_BDC_DATA
*& Form BDC_INSERT
* text
* --> p1 text
*----------------------------------------------------------------------*
BDC_INSERT.
CALLFUNCTION'BDC_INSERT'
EXPORTING
'KO01'
TABLES
SY-SUBRC <> .
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIFENDFORM" BDC_INSERT
*& Form BDC_CLOSE_GROUP
* text
* --> p1 text
*----------------------------------------------------------------------*
BDC_CLOSE_GROUP.
CALLFUNCTION'BDC_CLOSE_GROUP' SY-SUBRC <> .
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIFENDFORM" BDC_CLOSE_GROUP
*& Form CALL_TRANSACTION
* text
* --> p1 text
*----------------------------------------------------------------------*
CALL_TRANSACTION.
CALLTRANSACTION'KO01'USING BDCMODE
INTO* IF SYST-SUBRC <> 0.
* EXPORTING
* MSGNO = SY-MSGNO
* MSGV1 = SY-MSGV1
* MSGV3 = SY-MSGV3
* MSGV5 = ' '
* ERROR = ERROR
* MSGLN = MSGLN.
. <font color="gray" face=""">" CALL_TRANSACTION
*& Form BDCDATA
* text
* -->P_0310 text
*----------------------------------------------------------------------*
BDCDATA P_BEGIN P_FIELD1 P_FIELD2.
CLEAR P_BEGIN.
WHEN'X' GT_BDCDATA- = P_FIELD1.
DYNPRO GT_BDCDATA-DYNBEGIN = .
WHEN GT_BDCDATA-FNAM = P_FIELD1.
.
APPENDENDFORM" BDCDATA
*& Form WRITE_REPORT
* text
* --> p1 text
*----------------------------------------------------------------------*
WRITE_REPORT.
DESCRIBETABLELINES GV_LIN >= .
PERFORMUSING'Z3''I''000'
'The following Internal Orders already exist.''''''' COLLECT_MESSAGES GV_C_ULINE .
LOOPAT COLLECT_MESSAGES GT_EXISTS-AUFNR .
ENDLOOP COLLECT_MESSAGES GV_C_ULINE .
ENDIF GT_PRFT_CNTR GV_LIN.
IF1 COLLECT_MESSAGES .
PERFORMUSING'Z3''I''000'
'''''' COLLECT_MESSAGES .
LOOPAT COLLECT_MESSAGES GT_PRFT_CNTR-AUFNR
'''' .
PERFORMUSING'Z3''I''000'
'''''' .
DESCRIBETABLELINES GV_LIN >= .
PERFORMUSING'Z3''I''000'
'BDC was created for the following Internal Orders.'
'''''' COLLECT_MESSAGES GV_C_ULINE .
LOOPAT COLLECT_MESSAGES GT_SUBMIT-AUFNR .
ENDLOOP COLLECT_MESSAGES GV_C_ULINE .
ENDIF COLLECT_MESSAGES .
PERFORMUSING'Z3''I''000'
'''''' GT_TABLE GSBER = .
LOOPAT COLLECT_MESSAGES GT_TABLE-AUFNR .
ENDLOOP COLLECT_MESSAGES GV_C_ULINE .
. <font color="gray" face=""">" WRITE_REPORT
*& Form COLLECT_MESSAGES
* Collects messgaes into rep tree table and writes them to
*----------------------------------------------------------------------*
* -->P_MSGTY messgae type
* -->P_MSG1 text 1
* -->P_MSG3 text 3
*----------------------------------------------------------------------*
COLLECT_MESSAGES P_MSGID
P_MSGNR
P_MSGV2
P_MSGV4.
CLEAR GT_IMESG-ARBGB = P_MSGID.
GT_IMESG-TXTNR = P_MSGNR.
02'@ ' GT_IMESG-MSGV1+() = P_MSGV1.
GT_IMESG-MSGV3 = P_MSGV3.
GT_IMESG.
CONCATENATE GV_C170 SPACE.
WRITEENDFORM" collect_messages
<font color="gray" face=""">http://blog.csdn.net/zcywset15/archive/2008/07/29/2728001.aspx