原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
数据同步平台是在ABAP中开发的一个数据同步工具,类似于LTRC,通过配置实现任意两个数据库的数据同步(ABAP需要配置相关的外部数据库连接).
数据同步平台的底层通过调用ADBC类实现远程数据库的读取,写入.
数据同步平台也支持调用PO传递数据
**本文主要介绍怎么在其它程序中调用数据同步平台并传递选择条件**
二
数据选择条件
数据同步平台通过动态选择屏幕获取选择条件. 回车后, 会读取接口编号上次保存的选择条件
通过临时复选框区分选择条件是正式使用,还是当前界面临时使用. 避免临时使用的选择条件影响了正式运行的后台作业(临时标记和执行程序的用户名关联的).
详情参阅
> 数据过滤机制 无峰,公众号:ABAP 技巧与实战 [ SAP 工具箱 数据同步平台(八 改进数据过滤机制)
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247487684&idx=1&sn=f321832e37db563aa0ac23b844025e4c&chksm=cf5dcdf2f82a44e4be9bf4d54abd5b25886d7676e64a7b82a2357d72404e5c8d7d40a8a323d1&token=284235980&lang=zh_CN#rd)
三
选择条件的保存
过滤条件通过EXPORT TO DATABASE 语句写入特殊表 INDX 区域 sl
其中 gt_cond内表是后续数据处理时需要的内容(确定数据的过滤条件).
四
选择条件的使用
通过import 语句读取之前写入的条件
其中内表GT_COND 通过类型 RSDS_TWHERE 定义
gt_cond TYPE rsds_twhere,
该内表的内容可以通过函数
FREE_SELECTIONS_EX_2_WHERE获取
函数需要传递的内表包含下图的结构. 其中通过OPTION LOW HIGH 定义复杂的数据筛选条件.(类似与选择屏幕的RANGE: SIGN OPTION
LOW HIGH)
_**01** _
**数据结构**
函数传入参数的基本数据使用下图的结构
_**02** _
**嵌套内表**
通过嵌套内表表达每个表的选择条件,数据同步平台作为接口使用时,只会使用主表字段作为选择条件.所以这里TABLENAME填写主表表名即可.
_**03** _
**几种表达方式**
单个字段单个条件
单个字段多个条件
多个字段,每个字段多个条件
多个字段,其中一个字段单个条件
多个字段,都是单一条件
五
示例程序
源代码附在文末
核心逻辑是把特定字段的选择按总结的规则写入lt_tab内表, 调用函数转换成SQL条件. 并通过 EXPORT TO DATABASE 传递条件.
数据同步平台会使用相应的规则读取之前写入的条件.
_需要注意的是, 因为ID的命名规则中使用了用户名. 如果submit调度后台作业, 需要确保这里使用的用户名与后台作业执行的用户名一致_
_P_LOG用来控制是否显示处理日志_
_下图是数据同步平台的示例代码调用的接口配置
六
总结
数据同步平台一般情况下是通过后台调度. 特殊情况可能需要使用其它程序来调用.这样丰富了数据同步平台的更多的应用场景.
七
示例程序源代码
*&---------------------------------------------------------------------**& Report ZTS_CALL_SYNC*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zts_call_sync.
PARAMETERS: p_subrc TYPE i. "几种数据过滤条件PARAMETERS: p_log AS CHECKBOX .START-OF-SELECTION. PERFORM call_sync.
*&---------------------------------------------------------------------**& Form call_sync*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------*FORM call_sync . DATA: lv_jiekno(12). DATA: lv_id TYPE indx_srtfd. DATA: lt_expr TYPE rsds_texpr, lt_tab TYPE rsds_expr_tab, lt_cond TYPE rsds_twhere.
"指定需要调用的接口编号 lv_jiekno = 'SYN001'. "示例接口编号 "设置保存数据的ID,确保用户名同最终数据同步平台执行的用户名一致(后台调度) lv_id = lv_jiekno && sy-uname && '_TEMP'. "构造选择条件:选择字段来自接口的主表中的字段 CASE p_subrc. WHEN 0. "单个字段,多个条件 lt_tab = VALUE #( ( logop = 'OR' arity = 2 ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A01' high = '' ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A02' high = '' ) ). WHEN 1. "单个字段,单个条件 lt_tab = VALUE #( ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A02' high = '' ) ).
WHEN 2. "多个字段,多个条件 lt_tab = VALUE #( ( logop = 'AND' arity = 2 ) ( logop = 'OR' arity = 2 ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A01' high = '' ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A02' high = '' ) ( logop = 'OR' arity = 2 ) ( logop = '' arity = 0 fieldname = 'EXNAM' option = 'EQ' low = 'AA' high = '' ) ( logop = '' arity = 0 fieldname = 'EXNAM' option = 'EQ' low = 'BB' high = '' ) ). WHEN 3. "多个字段,其它一个字段单条件 lt_tab = VALUE #( ( logop = 'AND' arity = 2 ) ( logop = 'OR' arity = 2 ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A01' high = '' ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A02' high = '' ) ( logop = '' arity = 0 fieldname = 'EXNAM' option = 'EQ' low = 'BB' high = '' ) ). WHEN 4. "多个字段,都是单一条件 lt_tab = VALUE #( ( logop = 'AND' arity = 2 ) ( logop = '' arity = 0 fieldname = 'EXSYS' option = 'EQ' low = 'A01' high = '' ) ( logop = '' arity = 0 fieldname = 'EXNAM' option = 'EQ' low = 'BB' high = '' ) ). ENDCASE. lt_expr = VALUE #( ( tablename = 'ZTIF001' expr_tab = lt_tab ) ). "调用函数获取选择条件 CALL FUNCTION 'FREE_SELECTIONS_EX_2_WHERE' EXPORTING expressions = lt_expr IMPORTING where_clauses = lt_cond EXCEPTIONS expression_not_supported = 1 OTHERS = 2. "保存选择条件 EXPORT gt_cond = lt_cond TO DATABASE indx(sl) ID lv_id. COMMIT WORK AND WAIT. "调用特定接口 DATA: lr_jiekno TYPE RANGE OF ztsync_c1-jiekno. lr_jiekno = VALUE #( ( sign = 'I' option = 'EQ' low = lv_jiekno ) ). SUBMIT zbc_sync_remote_table_para WITH s_jiekno IN lr_jiekno WITH p_zjk = 'X' "接口模式 WITH p_temp = 'X' "临时动态选择 WITH p_ini = 'X' "全量 WITH p_chg = '' "变化量 WITH p_log = p_log "控制是否显示日志 AND RETURN.ENDFORM.** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论