BDC 经典实例

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值