DOCX

BDC

By Valerie Lopez,2014-07-06 03:35
12 views 0
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 * Project : N/A

    * Author : Kevin.Zhang

    * Date : 2007.1.1

    * Module : N/A

    * Description : Advanced BDC

    *

    *

    *

* Special features: N/A

    *

    *

    *----------------------------------------------------------------------* * Modifications:

    * Author Date Commented as Description

    *----------- -------- ----------- ----------------------------------* *

    *----------------------------------------------------------------------*

REPORT Z_KEVIN_ADV_BDC.

    *$*$----------------------------------------------------------------$*$* *$*$ Global Types, Data Statements, Ranges, Constants $*$* *$*$----------------------------------------------------------------$*$*

    *----------------------------------------------------------------------- * Tables

    *----------------------------------------------------------------------- TABLES: COAS, CEPC.

    *----------------------------------------------------------------------- * Internal Tables and Work Areas

    *----------------------------------------------------------------------- DATA: BEGIN OF GT_TABLE OCCURS 0, "internal order table

     AUART LIKE AUFK-AUART, "order type

     AUFNR LIKE AUFK-AUFNR, "order number

     KTEXT LIKE AUFK-KTEXT, "description

     BUKRS LIKE AUFK-BUKRS, "company code

     GSBER LIKE AUFK-GSBER, "business area

     PRCTR LIKE AUFK-PRCTR, "profit center

     FUNCA LIKE AUFK-FUNC_AREA, "function area

     END OF GT_TABLE.

DATA: BEGIN OF GT_EXISTS OCCURS 0. "existed IO

     INCLUDE STRUCTURE GT_TABLE.

    DATA: END OF GT_EXISTS.

    DATA: BEGIN OF GT_PRFT_CNTR OCCURS 0."the profit center not existing IO

     INCLUDE STRUCTURE GT_TABLE.

    DATA: END OF GT_PRFT_CNTR.

DATA: BEGIN OF GT_SUBMIT OCCURS 0. "the submitted IO

     INCLUDE STRUCTURE GT_TABLE.

    DATA: END OF GT_SUBMIT.

DATA: BEGIN OF GT_BDCDATA OCCURS 0. "BDC DATA

     INCLUDE STRUCTURE BDCDATA.

    DATA: END OF GT_BDCDATA.

DATA: BEGIN OF GT_MESSTAB OCCURS 10. "message table

     INCLUDE STRUCTURE BDCMSGCOLL.

    DATA: END OF GT_MESSTAB.

    DATA: GT_IMESG LIKE MESG OCCURS 0 WITH HEADER LINE.

    *----------------------------------------------------------------------- * Variables

    *----------------------------------------------------------------------- DATA: GV_GROUP(12) TYPE C VALUE 'INTERNAL_ORD', "BDC Name

     GV_USER(12) TYPE C, "BDC User

     GV_KEEP(1) TYPE C VALUE 'X', " ' '=Delete,'X'=keep after processing

     GV_HOLDDATE LIKE SY-DATUM. "Date

DATA: GV_FLAG(1) TYPE C,

     GV_LIN TYPE I. "number of orders

DATA: GV_C170(170),

     GV_C_ULINE(50) VALUE '__________________________________________________'.

    *$*$----------------------------------------------------------------$*$* *$*$ Selection Screen $*$* *$*$----------------------------------------------------------------$*$* *----------------------------------------------------------------------- * Selection Screen

    *----------------------------------------------------------------------- PARAMETERS: BDCTYPE(1) TYPE C DEFAULT 'B' NO-DISPLAY,

     BDCMODE LIKE BDCRUN-BDC_AMODUS DEFAULT 'A' NO-DISPLAY.

SELECTION-SCREEN COMMENT 10(70) TEXT-001.

    PARAMETERS: IN_FILE(128) DEFAULT 'C:\TEMP\*.txt'.

    SELECTION-SCREEN SKIP 1.

    *----------------------------------------------------------------------- * At Selection Screen

    *-----------------------------------------------------------------------

    *--------- AT SELECTION-SCREEN ON VALUE-REQUEST ---------- AT SELECTION-SCREEN ON VALUE-REQUEST FOR IN_FILE.

     CALL FUNCTION 'WS_FILENAME_GET'

     EXPORTING

     DEF_FILENAME = '*.txt'

     DEF_PATH = 'C:\DATA'

     MASK = ',All Files,*.*,Text Files,*.txt;*.doc.'

     MODE = 'O'

     TITLE = 'Please choose file to use '

     IMPORTING

     FILENAME = IN_FILE

     EXCEPTIONS

     INV_WINSYS = 1

     NO_BATCH = 2

     SELECTION_CANCEL = 3

     SELECTION_ERROR = 4

     OTHERS = 5.

*$*$----------------------------------------------------------------$*$*

    *$*$ Main Program $*$*

    *$*$----------------------------------------------------------------$*$*

    *--------- START-OF-SELECTION ---------- START-OF-SELECTION.

     REFRESH GT_TABLE.

* Uploading the data which will be inserted into the internal table

     CALL FUNCTION 'WS_UPLOAD'

     EXPORTING

     FILENAME = IN_FILE

     FILETYPE = 'DAT'

     TABLES

     DATA_TAB = GT_TABLE

     EXCEPTIONS

     CONVERSION_ERROR = 1

     FILE_OPEN_ERROR = 2

     FILE_READ_ERROR = 3

     INVALID_TABLE_WIDTH = 4

     INVALID_TYPE = 5

     NO_BATCH = 6

     UNKNOWN_ERROR = 7

     OTHERS = 8.

     IF SY-SUBRC <> 0.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     'Unable to upload input file '

     IN_FILE '' ''.

     ENDIF.

     SORT GT_TABLE BY AUFNR GSBER DESCENDING.

     DELETE ADJACENT DUPLICATES FROM GT_TABLE COMPARING AUFNR.

     PERFORM OPEN_GROUP.

     PERFORM FILL_BDC_DATA.

     PERFORM BDC_CLOSE_GROUP.

     PERFORM WRITE_REPORT.

*--------- END-OF-SELECTION ----------

    *$*$----------------------------------------------------------------$*$* *$*$ Subroutines $*$* *$*$----------------------------------------------------------------$*$*

    *&---------------------------------------------------------------------* *& Form OPEN_GROUP

    *&---------------------------------------------------------------------* * text

    *----------------------------------------------------------------------* * --> p1 text

    * <-- p2 text

    *----------------------------------------------------------------------* FORM OPEN_GROUP.

     GV_USER = SY-UNAME.

     CALL FUNCTION 'BDC_OPEN_GROUP'

     EXPORTING

     CLIENT = SY-MANDT

     GROUP = GV_GROUP

     HOLDDATE = GV_HOLDDATE

     KEEP = GV_KEEP

     USER = GV_USER.

     IF SY-SUBRC <> 0.

    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

    * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

     ENDIF.

    ENDFORM. " OPEN_GROUP

*&---------------------------------------------------------------------*

    *& Form FILL_BDC_DATA

    *&---------------------------------------------------------------------*

    * text

    *----------------------------------------------------------------------*

    * --> p1 text

    * <-- p2 text

    *----------------------------------------------------------------------*

    FORM FILL_BDC_DATA.

     CLEAR GT_TABLE.

     LOOP AT GT_TABLE.

     CLEAR GT_MESSTAB.

     CLEAR GT_BDCDATA.

     REFRESH GT_BDCDATA.

     REFRESH GT_MESSTAB.

     CLEAR GV_FLAG.

* Check if Profit Center exists.

     SELECT SINGLE * FROM CEPC

     WHERE PRCTR = GT_TABLE-PRCTR.

     IF SY-SUBRC <> 0.

     CLEAR GT_PRFT_CNTR.

     MOVE-CORRESPONDING GT_TABLE TO GT_PRFT_CNTR.

     APPEND GT_PRFT_CNTR.

     GV_FLAG = 'X'.

     ENDIF.

    * check if Internal Order has already been created.

     SELECT SINGLE * FROM COAS

     WHERE AUFNR = GT_TABLE-AUFNR.

     IF SY-SUBRC = 0.

     CLEAR GT_EXISTS.

     MOVE-CORRESPONDING GT_TABLE TO GT_EXISTS.

     APPEND GT_EXISTS.

     GV_FLAG = 'X'.

     ENDIF.

     IF GV_FLAG <> 'X'.

     PERFORM BDCDATA USING: 'X' 'SAPMKAUF' '0100', "order type

     ' ' 'COAS-AUART' GT_TABLE-AUART,

     ' ' 'BDC_OKCODE' '=KOKR'.

     PERFORM BDCDATA USING: 'X' 'SAPLSPO4' '0300', "control area

     ' ' 'SVALD-VALUE(01)' '1000',

     ' ' 'BDC_OKCODE' '=FURT'.

     PERFORM BDCDATA USING: 'X' 'SAPMKAUF' '0100', "ok code

     ' ' 'BDC_OKCODE' '/00'.

     PERFORM BDCDATA USING: 'X' 'SAPMKAUF' '0600', "order master data

     ' ' 'COAS-AUFNR' GT_TABLE-AUFNR,

     ' ' 'COAS-KTEXT' GT_TABLE-KTEXT,

     ' ' 'COAS-BUKRS' GT_TABLE-BUKRS,

     ' ' 'COAS-GSBER' GT_TABLE-GSBER,

     ' ' 'COAS-PRCTR' GT_TABLE-PRCTR,

     ' ' 'COAS-FUNC_AREA' GT_TABLE-FUNCA,

     ' ' 'BDC_OKCODE' '=SICH'.

* PERFORM CALL_TRANSACTION. "for test purpose

     PERFORM BDC_INSERT.

     MOVE-CORRESPONDING GT_TABLE TO GT_SUBMIT.

     APPEND GT_SUBMIT.

     ENDIF.

     ENDLOOP.

    ENDFORM. " FILL_BDC_DATA

    *&---------------------------------------------------------------------* *& Form BDC_INSERT

    *&---------------------------------------------------------------------* * text

    *----------------------------------------------------------------------* * --> p1 text

    * <-- p2 text

    *----------------------------------------------------------------------* FORM BDC_INSERT.

     CALL FUNCTION 'BDC_INSERT'

     EXPORTING

     TCODE = 'KO01'

     TABLES

     DYNPROTAB = GT_BDCDATA.

     IF SY-SUBRC <> 0.

    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

    * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

     ENDIF.

ENDFORM. " BDC_INSERT

    *&---------------------------------------------------------------------* *& Form BDC_CLOSE_GROUP

    *&---------------------------------------------------------------------* * text

    *----------------------------------------------------------------------* * --> p1 text

    * <-- p2 text

    *----------------------------------------------------------------------* FORM BDC_CLOSE_GROUP.

     CALL FUNCTION 'BDC_CLOSE_GROUP'.

     IF SY-SUBRC <> 0.

    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

    * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

     ENDIF.

ENDFORM. " BDC_CLOSE_GROUP

    *&---------------------------------------------------------------------* *& Form CALL_TRANSACTION

    *&---------------------------------------------------------------------* * text

    *----------------------------------------------------------------------* * --> p1 text

    * <-- p2 text

    *----------------------------------------------------------------------* FORM CALL_TRANSACTION.

     CALL TRANSACTION 'KO01' USING GT_BDCDATA

     MODE BDCMODE

     MESSAGES INTO GT_MESSTAB.

    * IF SYST-SUBRC <> 0.

    * CALL FUNCTION 'WRITE_MESSAGE'

    * EXPORTING

    * MSGID = SY-MSGID

* MSGNO = SY-MSGNO

    * MSGTY = SY-MSGTY

    * MSGV1 = SY-MSGV1

    * MSGV2 = SY-MSGV2

    * MSGV3 = SY-MSGV3

    * MSGV4 = SY-MSGV4

    * MSGV5 = ' '

    * IMPORTING

    * ERROR = ERROR

    * MESSG = MESSG

    * MSGLN = MSGLN.

ENDFORM. " CALL_TRANSACTION

    *&---------------------------------------------------------------------* *& Form BDCDATA

    *&---------------------------------------------------------------------* * text

    *----------------------------------------------------------------------* * -->P_0310 text

    * -->P_0311 text

    *----------------------------------------------------------------------* FORM BDCDATA USING P_BEGIN P_FIELD1 P_FIELD2.

     CLEAR GT_BDCDATA.

     CASE P_BEGIN.

     WHEN 'X'.

     GT_BDCDATA-PROGRAM = P_FIELD1.

     GT_BDCDATA-DYNPRO = P_FIELD2.

     GT_BDCDATA-DYNBEGIN = 'X'.

     WHEN SPACE.

     GT_BDCDATA-FNAM = P_FIELD1.

     GT_BDCDATA-FVAL = P_FIELD2.

     ENDCASE.

     APPEND GT_BDCDATA.

ENDFORM. " BDCDATA

    *&---------------------------------------------------------------------* *& Form WRITE_REPORT

    *&---------------------------------------------------------------------* * text

    *----------------------------------------------------------------------* * --> p1 text

* <-- p2 text

    *----------------------------------------------------------------------*

    FORM WRITE_REPORT.

     DESCRIBE TABLE GT_EXISTS LINES GV_LIN.

     IF GV_LIN >= 1.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     'The following Internal Orders already exist.' '' '' ''.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     GV_C_ULINE '' '' ''.

     LOOP AT GT_EXISTS.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     GT_EXISTS-AUFNR '' '' ''.

     ENDLOOP.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     GV_C_ULINE '' '' ''.

     ENDIF.

     DESCRIBE TABLE GT_PRFT_CNTR LINES GV_LIN.

     IF GV_LIN >= 1.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     'The following Profit centers do not exist.' '' '' ''.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     GV_C_ULINE '' '' ''.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     'Internal Order Profit Center.' '' '' ''.

     LOOP AT GT_PRFT_CNTR.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     GT_PRFT_CNTR-AUFNR

     GT_PRFT_CNTR-PRCTR '' ''.

     ENDLOOP.

     PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'

     GV_C_ULINE '' '' ''.

     ENDIF.

Report this document

For any questions or suggestions please email
cust-service@docsford.com