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
* 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 ProfitCenterexists.
    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 OrderProfitCenter.' '' '' ''.

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.

DESCRIBE TABLE GT_SUBMIT LINES GV_LIN.

IF GV_LIN >= 1.
    PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                   'BDC was created for the following Internal Orders.'
                    '' '' ''.
    PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                                   GV_C_ULINE '' '' ''.

LOOP AT GT_SUBMIT.
      PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                                GT_SUBMIT-AUFNR '' '' ''.
    ENDLOOP.

PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                                   GV_C_ULINE '' '' ''.
  ENDIF.

PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                  'The following Internal Orders have no Business Area.'
                  '' '' ''.
  PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                                 GV_C_ULINE '' '' ''.

DELETE GT_TABLE WHERE NOT GSBER = ' '.

LOOP AT GT_TABLE.
    PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                              GT_TABLE-AUFNR '' '' ''.
  ENDLOOP.

PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'
                                 GV_C_ULINE '' '' ''.
ENDFORM.                               " WRITE_REPORT

*&---------------------------------------------------------------------*
*&      Form  COLLECT_MESSAGES
*&---------------------------------------------------------------------*
*       Collects messgaes into rep tree table and writes them to
*       screen for regular reporting
*----------------------------------------------------------------------*
*      -->P_MSGID  message id
*      -->P_MSGTY  messgae type
*      -->P_MSGNR  msg number
*      -->P_MSG1  text 1
*      -->P_MSG2  text 2
*      -->P_MSG3  text 3
*      -->P_MSG4  text 4
*----------------------------------------------------------------------*
FORM COLLECT_MESSAGES USING    P_MSGID
                               P_MSGTY
                               P_MSGNR
                               P_MSGV1
                               P_MSGV2
                               P_MSGV3
                               P_MSGV4.

CLEAR GT_IMESG.

GT_IMESG-ARBGB = P_MSGID.
  GT_IMESG-MSGTY = P_MSGTY.
  GT_IMESG-TXTNR = P_MSGNR.
  GT_IMESG-MSGV1+0(2) = '@ '.
  GT_IMESG-MSGV1+2(48) = P_MSGV1.
  GT_IMESG-MSGV2 = P_MSGV2.
  GT_IMESG-MSGV3 = P_MSGV3.
  GT_IMESG-MSGV4 = P_MSGV4.
  APPEND GT_IMESG.

CONCATENATE P_MSGV1 P_MSGV2 P_MSGV3 P_MSGV4
              INTO GV_C170 SEPARATED BY SPACE.
  WRITE:/ GV_C170.

ENDFORM.                    " collect_messages

ABAP总结之二,BDC完整版相关推荐

  1. 【已更新】万能门店小程序独立版V5.1二开完整版 无限DIY+不限制小程序生成数量+数10款插件

    万能店小程序DIY建站无限独立版非微引擎应用,独立版是基于国内流行的ThinkPHP5框架开发适用于各行各业的小程序和企业门店的小程序! 通用商店微信小程序不限制小程序生成的数量,支持多页面.预约功能 ...

  2. 第一季8:完整版(即包含mpp)根文件系统的制作

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 一.概述 mpp是海思编写的与视频编解码有关的驱动.库等内容.我们需要部署这些内容,也就是把这些内容放在合适的目录位置. 二.mpp的目 ...

  3. php mysql bbs_BBS(php mysql)完整版(二)

    BBS(php & mysql)完整版(二) 更新时间:2006年10月09日 00:00:00   作者: //此页面为look.php include "signup/mysql ...

  4. 2022苹果CMS 全新绿豆二开影视源码app源码完整版带安装教程

    (1条消息) 2022全新绿豆二开影视源码苹果CMSapp源码完整版带安装教程-小程序文档类资源-CSDN文库https://download.csdn.net/download/weixin_740 ...

  5. 广东二本计算机专业大学排名及分数线,2021年广东二本大学排名及分数线(完整版)...

    广东二本大学排名及分数线(完整版) 广东共有三所二本高校相继升为一本,分别是广工.广医和广大.今年广东的一本录取率肯定会有所增加,但是否意味着今年的二本竞争会更加激烈?在日前举办的高考志愿咨询会上,多 ...

  6. 雷士照明股权连环局(第一 二 三季完整版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转自:h ...

  7. 雷士照明股权连环局(第一、二、三季完整版)

    转自:http://blog.sina.com.cn/s/blog_4ee9953301014f1o.html [博按]可以毫不夸张地说,本文是目前为止关于雷士变局最为完整.最具深度.最经得起专业拷问 ...

  8. (王爽)汇编语言-课程设计二完整版

    王爽汇编语言-课程设计二 前言 特别感谢 实验结果 实验思路 如何优化调试流程以节省时间 源码 未完成部分 前言 刚刚把lab2调试完,2021年10月12日 16:26:36,本来是打算在oneno ...

  9. 苹果CMS全新二开影视源码app源码完整版

    文章目录 前言 一.苹果CMS 全新二开影视源码app源码完整版 二.程序演示与下载 1.程序演示 2.程序下载 前言 苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统, ...

最新文章

  1. 回顾2020,我国无人机经历了四大新变化
  2. 【51NOD1287】加农炮
  3. python编辑器和终端_从python curses程序运行终端文本编辑器
  4. 如何为javascript代码编写注释以支持智能感知
  5. Bash判断文件夹(目录)是否存在
  6. setsockopt设置套接口选项
  7. mysql 当前时区_如何获取MySQL的当前时区?
  8. 关于虚拟化 云计算
  9. 博文搬家到公众号了~~~
  10. 主动提交事务_对于分布式事务,我“开门见山”地谈到这些理解,面试官都听懵了...
  11. dnf时装预览怎么打开_dnf时装预览怎么打开_dnf怎么查找各职业时装代码
  12. 全球国家经纬度坐标数据-MySQL
  13. 毛笔书法艺术作品,能不能写简化字?
  14. VIM7.3中文手册
  15. 备受全球瞩目的「USDT集体索赔案」来龙去脉|全文译本
  16. 永久免费的英文字体生成软件,例:
  17. USG6500端口映射
  18. 注册公司经营范围还不知道怎么写?看这一篇就够了!
  19. 服务器系统server2008 qq,WindowsServer2008R2服务器系统安装教程
  20. 【“工业大数据预测”系列】——第3篇:基于统计和信号的特征提取

热门文章

  1. 用墨刀做出的交互动效,10个优秀作品欣赏
  2. python情感分析(真实案例完整流程)
  3. windows硬盘读写测试
  4. Golang Log日志库
  5. java字符串是否相等的三种判断方法
  6. JAVA计算机毕业设计学术会议信息网站Mybatis+源码+数据库+lw文档+系统+调试部署
  7. 算法工程师(机器学习/深度学习)Offer的准备流程
  8. 【CloudCompare】高程显示
  9. 数据库中的层次模型是什么(树形结构)
  10. 【AUTOSAR】【以太网】 EthIf