在日常开发中,经常会遇到需要跨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', "AAA即DBCO中配置的数据库链接名称
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.