BDC经典实例

    技术2022-05-19  21

    BDCbatch 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.   当然,不使用程序RSBDCSUBJOB,每次手工在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


    最新回复(0)