SAP连接(外部)其他数据库案例

2023-10-13 16:59:47 浏览数 (1)

项目需求:SAP系统直接连接中间库数据库,定时的获取中间库的数据,中间库是ORACLE数据库。

1)查询出(外部)ORACLE表里所有数据放入内表

2)把内表里面的数据插入到SAP表

3)把(SAP)内表里的数据插入到(外部)ORACLE数据库

4)删除(外部)ORACLE数据库表数据

1、配置连接数据库

事务代码DBCO,编辑-新建条目

DB连接:输入连接的名称

DBMS:Oracel选择ORA 

用户名:输入用户名

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

连接信息: "10.10.1.20:1521/XXX" 

输入IP和端口  XXX为ORACLE-SID

永久:勾上

2、测试是否联通

事务代码SE38 程序名  ADBC_TEST_CONNECTION

输入连接名称运行

可以用 ADBC_QUERY  查询表结构和数

3、代码:连接外部数据库
代码语言:javascript复制
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.

TRY.
    " 连接
    EXEC SQL.
      CONNECT TO :连接名称
    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.
4、代码:查询数据,查询多条数据到内表
代码语言:javascript复制
FORM frm_select_db_all .
 TRY.
  EXEC SQL PERFORMING frm_append_data.
  SELECT  NAME,
          WORKORDER,
          PRODUCTNAME,
          ID,
          QUANTITY,
          SOURCEPRODUCTNAME,
          SOURCEPRODUCTQUANTITY,
          COMPONENTID,
          VENDORLOTID,
          VENDORNAME,
          ISSUEDATE,
          ISSUETIME,
          USERID,
          UPDATETIMES,
          TXNTIMES
   INTO :LS_SOURSE
   FROM SAP.SOURSE
  ENDEXEC.
ENDTRY.
ENDFORM.

FORM frm_append_data .

  APPEND LS_SOURSE TO LT_SOURSE.
  CLEAR LS_SOURSE.
ENDFORM.
5、代码:删除外部数据库表数据
代码语言:javascript复制
FORM frm_delete_db .
  TRY.
      EXEC SQL.
        DELETE RSC.USERD
      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.
6、代码:插入多条数据到外部数据库
代码语言:javascript复制
FORM frm_insert_db .
  TRY.
    LOOP AT gt_userd INTO DATA(gs_userd).
      EXEC SQL.
        INSERT INTO RSC.USERD
        (FA,
        STROE,
        STROE_DSC,
        MATERIAL,
        MATERIAL_NO,
        STROE_N,
        UNIT,
        UNIT_DSC
        ) VALUES
        (:GS_USERD-FA,
        :GS_USERD-STROE,
        :GS_USERD-STROE_DSC,
        :GS_USERD-MATERIAL,
        :GS_USERD-MATERIAL_NO,
        :GS_USERD-STROE_N,
        :GS_USERD-UNIT,
        :GS_USERD-UNIT_DSC
        )
      ENDEXEC.
      IF sy-subrc = 0.
        EXEC SQL.
          COMMIT
        ENDEXEC.
       ELSE.
          EXEC SQL.
            ROLLBACK
          ENDEXEC.
      ENDIF.
    ENDLOOP.



  ENDTRY.

ENDFORM.

0 人点赞