分享

SAP系统如何使用中间数据库与其它系统进行数据交互

 ERP文库 2024-03-13 发布于广东

声明:本文仅代表原作者观点,仅用于ERP软件的应用与学习,不代表任何公司。

SAP系统与外部系统之间进行数据交换和通信的接口方式有很多种,比如常用的接口技术有RFC、BAPI、ALE、Webservice、RESTful、中间数据库等等,不同的接口形式具有不同的特点和适用场景,可以根据具体需求选择合适的接口形式来实现系统间的数据交互。

前面文章中已介绍Webservice和RESTful的接口技术在SAP中应用,具体文章连接如下,本文重点介绍下中间数据库作为系统间交互的接口方式的应用。

SAP软件如何发布和调用RESTful接口

SAP软件Webservice接口技术应用

中间数据库作为系统间交互数据的基本机制

一般会部署一个专门的数据平台,不同业务系统不会直接将要传输的数据传输给其它业务系统,而是会传输给中间的数据库,要使用数据的业务系统,要主动去中间数据库取自己需要的数据(如下图所示

比如:系统A会将数据写入至中间数据库,B系统或系统C如果需要用到系统A的数据,它会到中间数据库去取需要的数据,反之亦然。

使用中间数据库作为系统间交互数据的优缺点分析

优点:

1、实现比较简单,对现有其它系统学习成本要求比较低,基本不需要考虑其它系统如何与SAP进行连接。

2、外部系统和SAP系统相对独立,接口不涉及双方内部的结构,数据的安全性得到保证。

缺点:

1、因为数据发送方的系统在给中间数据库写入数据时,数据接收方的系统并不知道,只能靠定时任务来获取最新数据,实时性不够高。

2、多系统集中地使用中间数据库,意味着如果这个数据库出现问题,就有可能大面积影响相关系统的正常运转。

SAP系统如何使用中间数据库

SAP连接外部数据库通常是要在DBCO中进行外部数据源配置。

SAP系统利用DBOC建立与中间数据库的关联,利用SQL或者TSQL直接对数据库进行操作,其它系统也对该中间表进行操作。

SAP 系统连接中间数据库的配置

1、配置连接数据库

执行事务码DBCO,点新条目按钮,填写如下图所示信息

DB连接:输入连接的名称

DBMS:MSSQL选择MSS(目前SAP中可以配置数据源的数据库有如下)

用户名:输入用户名

数据库口令:两次输入数据库密码

连接信息:这里的连接MSSQL的连接字符串,指定主机IP、数据库名即可,其它数据库参数名略有不同。

永久:勾上

2、测试是否联通

事务代码SE38 

程序名 :ADBC_TEST_CONNECTION

输入连接名称运行 

上图表示可以连通中间数据库。

下面通过一个例子来介绍下SAP如何对中间数据库的数据进行插入/更新/删除等操作。

业务需求如下:

某公司需要将SAP系统创建的采购申请(PR)推送至BPM(业务流程管理系统)进行审批,该公司使用中间数据库的方式进行数据交互。

大体业务流程如下:

1.SAP系统取未审批的采购申请(PR)数据,通过定时任务推送到中间数据库表。

2.BPM系统定时从中间数据库表取SAP推送过来的PR的新数据,生成审批流程。

3.BPM生成审批流后和审批完成都会更新中间数据库的PR状态。

4. SAP修改PR时候需要取中间数据库中该采购申请PR的状态,如果PR在审批中的状态,不能进行修改。

5. BPM审批完成后调用接口自动审批SAP中采购申请。

实现上面需求的主要关键代码示例

1.SAP取出未审批的PR数据
























TYPES : BEGIN OF TY_DATA,            BANFN   TYPE BANFN,  "采购申请号            BNFPO   TYPE BNFPO,  "采购申请项目            MATNR   TYPE MATNR,  "物料编码            TXZ01   TYPE TXZ01,  "物料描述            MENGE   TYPE MENGE,  "数量            MEINS   TYPE MEINS,  "数量单位            STATUS(1)  TYPE C,   "状态          END OF ty_data.  DATA : GT_EBAN TYPE TABLE OF TY_DATA,         GS_EBAN TYPE TY_DATA.  DATA :V_EXC_REF TYPE REF TO CX_SY_NATIVE_SQL_ERROR,      V_ERRTXT TYPE STRING,      V_SQLERR_REF TYPE REF TO CX_SQL_EXCEPTION.
DATA:Z_CON_NAME TYPE CHAR40 ."VALUE 'BPM782'.
Z_CON_NAME  = 'BPM80'. "连接名称       
CLEAR: GS_EBAN,GT_EBAN. SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_EBAN FROM EBAN      WHERE WERKS = '171O'AND FRGKZ = 'X' AND  LOEKZ <> 'X'.

2.连接中间数据库































*&---------------------------------------------------------------------**&     FRM_CONNECT_EXT_DB .*&---------------------------------------------------------------------**      1.连接外部数据库*----------------------------------------------------------------------*FORM FRM_CONNECT_EXT_DB .
TRY. " 连接 EXEC SQL. CONNECT TO :Z_CON_NAME "连接名称 ENDEXEC. CATCH CX_SY_NATIVE_SQL_ERROR INTO V_EXC_REF. V_ERRTXT = V_EXC_REF->GET_TEXT( ). CATCH CX_SQL_EXCEPTION INTO V_SQLERR_REF. IF V_SQLERR_REF->DB_ERROR = 'X'. V_ERRTXT = V_SQLERR_REF->SQL_MESSAGE. ELSE. V_ERRTXT = V_SQLERR_REF->INTERNAL_ERROR. ENDIF. ENDTRY. IF V_ERRTXT IS NOT INITIAL. E_STATUS = 'E'. E_MESSAGE = V_ERRTXT. ELSE. E_STATUS = 'S'. E_MESSAGE = '连接成功!'. ENDIF.
ENDFORM.

3.将取出PR数据推送至中间数据库














































*&---------------------------------------------------------------------**&   FRM_INSERT_EXT_DB*&---------------------------------------------------------------------**  3.插入多条数据到外部数据库*----------------------------------------------------------------------*FORM FRM_INSERT_EXT_DB .
TRY. LOOP AT GT_EBAN INTO GS_EBAN. EXEC SQL. INSERT INTO ZPR_EBAN_DATA ( BANFN, BNFPO, MATNR, TXZ01, MENGE, MEINS, STATUS )
VALUES ( :GS_EBAN-BANFN, :GS_EBAN-BNFPO, :GS_EBAN-MATNR, :GS_EBAN-TXZ01, :GS_EBAN-MENGE, :GS_EBAN-MEINS, :GS_EBAN-STATUS ) ENDEXEC.
IF SY-SUBRC = 0. EXEC SQL. COMMIT ENDEXEC. ELSE. EXEC SQL. ROLLBACK ENDEXEC. ENDIF.
ENDLOOP.
ENDTRY.
ENDFORM.

4.更新中间数据库的值






















*&---------------------------------------------------------------------**&   FRM_UPDATE_EXT_DB*&---------------------------------------------------------------------**  4.更新外部数据库*----------------------------------------------------------------------*FORM FRM_UPDATE_EXT_DB USING P_VBELN P_BNFPO .
TRY. EXEC SQL. UPDATE ZPR_EBAN_DATA SET STATUS = 1 WHERE BANFN = :P_BANFN AND BNFPO = :P_BNFPO "更新表ZPR_EBAN_DATA中PR的状态 ENDEXEC. COMMIT WORK AND WAIT. CATCH CX_SY_NATIVE_SQL_ERROR INTO EXC_REF. ERROR_TEXT = EXC_REF->GET_TEXT( ). EXEC SQL. DISCONNECT :L_CON_NAME ENDEXEC. MESSAGE E006(Z001) WITH ERROR_TEXT. ENDTRY.
ENDFORM. "FRM_UPDATE_EXT_DB

5.查询中间数据库到SAP程序内表


































*&---------------------------------------------------------------------**&   FRM_SELECT_EXT_DB_ALL*&---------------------------------------------------------------------**   5.1.查询数据,查询多条数据到内表*----------------------------------------------------------------------*
FORM FRM_SELECT_EXT_DB_ALL .
TRY. EXEC SQL PERFORMING FRM_APPEND_DATA. SELECT BANFN, BNFPO, MATNR, TXZ01, MENGE, MEINS, STATUS INTO :GS_EBAN FROM ZPR_EBAN_DATA ENDEXEC. ENDTRY.
ENDFORM. "FRM_SELECT_EXT_DB_ALL
*&---------------------------------------------------------------------**& FRM_APPEND_DATA.*&---------------------------------------------------------------------** 5.2.查询数据,查询多条数据到内表*----------------------------------------------------------------------*FORM FRM_APPEND_DATA . APPEND GS_EBAN TO GT_EBAN. CLEAR GS_EBAN.ENDFORM. "FRM_APPEND_DATA

6.删除中间数据库
































*&---------------------------------------------------------------------**&   FRM_APPEND_DATA.*&---------------------------------------------------------------------**   6.删除外部数据库表数据*----------------------------------------------------------------------*FORM FRM_DELETE_DB .
TRY. EXEC SQL. DELETE ZPR_EBAN_DATA. ENDEXEC. IF SY-SUBRC = 0. EXEC SQL. COMMIT ENDEXEC. ELSE. EXEC SQL. ROLLBACK ENDEXEC. ENDIF. CATCH CX_SY_NATIVE_SQL_ERROR INTO V_EXC_REF. V_ERRTXT = V_EXC_REF->GET_TEXT( ). CATCH CX_SQL_EXCEPTION INTO V_SQLERR_REF. IF V_SQLERR_REF->DB_ERROR = 'X'. V_ERRTXT = V_SQLERR_REF->SQL_MESSAGE. ELSE. V_ERRTXT = V_SQLERR_REF->INTERNAL_ERROR. ENDIF. ENDTRY.
ENDFORM. "FRM_DELETE_DB

7.断开与中间数据库连接











*&---------------------------------------------------------------------**&   FRM_DISCONNECT_EXT_DB .*&---------------------------------------------------------------------**    7.关闭连接*----------------------------------------------------------------------*FORM FRM_DISCONNECT_EXT_DB .  EXEC SQL.    DISCONNECT :l_CON_NAME  ENDEXEC.ENDFORM.                    "FRM_DISCONNECT_EXT_DB

    转藏 分享 献花(0

    0条评论

    该文章已关闭评论功能
    类似文章 更多