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