sap abap跨client同步数据以及连接外部数据库同步数据方案

在日常开发中,经常会遇到需要跨client同步数据的需求,保护自建表的数据同步,以及标准表数据同步(bapi之类),还有可能会遇到需要读取外部数据库,进行增删改查的需求(适用于外围系统无法运维,做接口的情况),针对这几种情况,下面整理了几种方法应对该需求。

1、bapi跨client同步数据 SM59先建立目标client的RFC连接-创建ABAP连接-技术设置里填写RFC目标名称描述主机实例号ip地址

在这里插入图片描述
登录&安全性-填写语言、集团、用户名、密码
在这里插入图片描述
点击连接测试,跳出测试结果
在这里插入图片描述
在这里插入图片描述
调用bapi时,在后面加上DESTINATION关键字和刚刚创建的RFC连接目标名称,重点:commit和rollback也要加
之后调用bapi即可在目标client生成采购订单等数据
在这里插入图片描述

2、跨client查询表数据

事务码:DBACOCKPIT建立数据库连接
在这里插入图片描述
点击添加-输入连接名称、数据库系统、连接数、用户名、密码、主机ip地址、端口号保存
在这里插入图片描述
在查询语句里使用关键字CLIENT SPECIFIED BYPASSING BUFFER CONNECTION 后面跟 刚刚创建的数据库连接名称即可查询目标client表数据,最好加上MANDT查询条件

    SELECT * INTO TABLE @DATA(lt_proj) FROM proj CLIENT SPECIFIED BYPASSING BUFFER CONNECTION 801
  FOR ALL ENTRIES IN @gt_data
      WHERE pspid EQ @gt_data-pspid.

3、跨client插入、更新、删除数据

同样也得建立数据库连接,之后代码实现
定义变量

DATA: g_errorstr(250) TYPE c,
      g_conexion      LIKE dbcon-con_name value 'AAA',   "AAADBCO中配置的数据库链接名称
      exec_ref        TYPE REF TO cx_sy_native_sql_error,
      error_text      TYPE string,
      cl_sqlerr_ref   TYPE REF TO cx_sql_exception,
      l_sql           TYPE string,
      lv_msg          TYPE string.

DATA:ls_log TYPE zcmtsql_log,
     lt_log TYPE TABLE OF zcmtsql_log,
     lv_set TYPE zcmt0007.

打开连接

  CLEAR g_errorstr.
*  g_conexion = conn.
  TRY.
      "--  连接SQL SERVER
      EXEC SQL.
        CONNECT TO :G_CONEXION
      ENDEXEC.

    CATCH cx_sy_native_sql_error INTO exec_ref.
      CONCATENATE '无法连接至SQL数据库   连接名:' g_conexion INTO g_errorstr.

  ENDTRY.
ENDFORM.

执行语句,举例只有更新,插入,删除同理

  TRY.
      IF input_flag EQ 'U'." 修改
        EXEC SQL .
          UPDATE zmmjsht SET  mwskz  = :input_data-mwskz,
                              zkbetr = :input_data-zkbetr,
                              kpein  = :input_data-kpein,
                              zzhesl = :input_data-zzhesl,
                              erdat = :input_data-erdat,
                              erzet = :input_data-erzet,
                              ernam = :input_data-ernam
          WHERE lifnr = :input_data-lifnr
          AND matnr = :input_data-matnr
          AND ekorg = :input_data-ekorg
          AND esokz = :input_data-esokz
          AND zzheth = :input_data-zzheth
        ENDEXEC.
      ELSE."插入
        EXEC SQL .
          INSERT INTO zmmjsht ( mandt, lifnr, matnr, ekorg, esokz, zzheth, mwskz, zkbetr, kpein, zzhesl, erdat, erzet, ernam, eloek )
          VALUES (:input_data-mandt, :input_data-lifnr, :input_data-matnr, :input_data-ekorg, :input_data-esokz, :input_data-zzheth, :input_data-mwskz, :input_data-zkbetr,
          :input_data-kpein, :input_data-zzhesl, :input_data-erdat, :input_data-erzet, :input_data-ernam,:input_data-eloek )
        ENDEXEC.
      ENDIF.
*
      IF sy-subrc <> 0.
        flag = 'E'.
        " 捕捉所有SQL相关的错误
        RAISE EXCEPTION TYPE cx_sy_native_sql_error.
*          exporting
*            textid = cx_sy_native_sql_error=>sql_error.  "所有SQL错误
      ELSE.
        flag = 'S'.
      ENDIF.
    CATCH cx_sy_native_sql_error INTO DATA(lv_native_sql_error).
      flag = 'E'.
      g_errorstr = lv_native_sql_error->get_text( ).
      CONCATENATE '执行sql失败:' g_errorstr INTO message.
    CATCH cx_root INTO DATA(lv_generic_exception).
      g_errorstr = lv_generic_exception->get_text( ).
      CONCATENATE '未知错误:' g_errorstr INTO message.
  ENDTRY.
  
    IF NOT g_errorstr IS INITIAL.
    CLEAR g_errorstr.
    EXEC SQL.
      ROLLBACK
    ENDEXEC.
  ELSE.

    EXEC SQL.
      COMMIT
    ENDEXEC.
  ENDIF.

关闭连接

*  关闭连接
  EXEC SQL.
    disconnect :g_conexion
  ENDEXEC.

4、连接外部数据库进行增删改查,只需要把第2步数据库连接,改成外部连接即可,根据业务执行具体语句

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值