SAP HANA SDA实战
什么是SDA?
SDA 全称Smart Data Access(智能数据访问)。SDA使远程数据能够像访问HANA中的本地表一样被访问,而无需将数据复制到SAP HANA。
在SAP HANA中,可以创建指向不同数据源中的远程表的虚拟表。
借助SDA访问SAP HANA,可以从外部数据库(例如Oracle、Mysql、HADOOP等)中的表中检索数据。这减少了将所有访问的数据加载到SAP HANA中的需要。
创建远程源
使用HANA STUDIO或者Eclipse并下载插件;登录HANA服务器,然后创建远程源。
选择连接的数据库系统,并设置好配置文件
该步骤由BASIS配置完成,不详细讲解。
创建虚拟表
SDA官方贴文
设置虚拟表名及库名即可创建。
但由于直接创建虚拟表不但SAP GUI无法看到,查询也无法实现,因此需要进行处理,
目前存在两种方法。
方法一:AMDP方法实现->创建CDS视图->ADBC进行增删改查
该方案是SAP推荐的方案,原文地址如下:SAP官方贴文
AMDP实现
因为虚拟表没有在 ABAP DDIC中注册,所以不能通过 ABAP CDS 技术直接访问。要解决此问题,需要表函数。
@ClientHandling.type: #CLIENT_DEPENDENT
define table function ZICMR_TF
returns
{
RCLNT : mandt;
method_id : ica_method_id;
DOCNR : ica_docnr;
DOCLN : ica_docln;
GRREF : ica_grref;
PSTAT : ica_pstat;
CSTAT : ica_cstat;
DUE_DATE : ica_due_date;
CLEARING_STATUS : ica_clearing_status;
rbukrs : bukrs;
ref_belnr : belnr_d;
gjahr : gjahr;
ref_docln : docln6;
xopvw : xopvw;
augdt : augdt;
augbl : augbl;
auggj : augbl;
bschl : bschl;
koart : koart;
umskz : umskz;
rwcur : waers;
wsl : fins_vwcur12;
rhcur : waers;
hsl : fins_vwcur12;
zuonr : dzuonr;
sgtxt : sgtxt;
rcomp : rcomp_d;
rassc : rassc;
racct : bilkt_ska1;
lracct : hkont;
kunnr : kunnr;
lifnr : lifnr;
awtyp : awtyp;
awkey : awkey;
awsys : awsys;
budat : budat;
bldat : bldat;
blart : blart;
xblnr : xblnr1;
bktxt : bktxt;
xref1_hd : xref1_hd;
xref2_hd : xref2_hd;
usnam : usnam;
cpudt : cpudt;
cputm : cputm;
aedat : aedat_bkpf;
bvorg : bvorg;
xreversing : co_stflg;
xreversed : co_stokz;
}
implemented by method
zicmr_remote_sources=>CALL_01;
数据读取逻辑在 AMDP 方法“zicmr_remote_sources=>CALL_01”中实现。 也可以在 ABAP 开发工具中创建 AMDP方法。只需创建一个普通的 ABAP 类,在其中添加一个静态方法“CALL_01”。只需参考下面的代码。
class zicmr_remote_sources definition
public
final
create public .
public section.
interfaces if_amdp_marker_hdb .
class-methods call_01
for table function zicmr_tf.
protected section.
private section.
endclass.
class zicmr_remote_sources implementation.
method call_01
by database function for hdb language sqlscript
options read-only.
return
select
SESSION_CONTEXT('CDS_CLIENT') as RCLNT,
'' as method_id,
'0000000000' as DOCNR,
0 as DOCLN,
'000000000000' as GRREF,
'00' as PSTAT,
'' as CSTAT,
'00000000' as DUE_DATE,
case when xopvw = 'X'
then ( case when augbl <> '' then '3'
else '1'
end )
else '0'
end as CLEARING_STATUS,
bseg.bukrs as rbukrs,
bseg.belnr as ref_belnr,
bseg.gjahr as gjahr,
concat('000', bseg.buzei) as ref_docln,
bseg.xopvw,
bseg.augdt,
bseg.augbl,
bseg.auggj,
bseg.bschl,
bseg.koart,
bseg.umskz,
bkpf.waers as rwcur,
case when bseg.shkzg = 'H' then 0 - wrbtr
else wrbtr end as wsl,
t001.waers as rhcur,
case when bseg.shkzg = 'H' then 0 - dmbtr
else dmbtr end as hsl,
bseg.zuonr,
bseg.sgtxt,
t001.rcomp,
bseg.vbund as rassc,
bseg.altkt as racct,
bseg.hkont as lracct,
bseg.kunnr,
bseg.lifnr,
bseg.awtyp,
bseg.awkey,
bseg.awsys,
bseg.h_budat as budat,
bseg.h_bldat as bldat,
bseg.h_blart as blart,
bkpf.xblnr,
bkpf.bktxt,
bkpf.xref1_hd,
bkpf.xref2_hd,
bkpf.usnam,
bkpf.cpudt,
bkpf.cputm,
bkpf.aedat,
bkpf.bvorg,
bkpf.xreversing,
bkpf.xreversed
from "/1BCAMDP/REMOTE_BSEG" as bseg /* or use "ZHANGVIN"."REMOTE_BSEG" */
inner join "/1BCAMDP/REMOTE_BKPF" as bkpf /* or use "ZHANGVIN"."REMOTE_BKPF" */
on bseg.mandt = bkpf.mandt
and bseg.bukrs = bkpf.bukrs
and bseg.belnr = bkpf.belnr
and bseg.gjahr = bkpf.gjahr
inner join "/1BCAMDP/REMOTE_T001" as t001 /* or use "ZHANGVIN"."REMOTE_T001" */
on bseg.mandt = t001.mandt
and bseg.bukrs = t001.bukrs
where bseg.mandt = '910'
and bseg.h_monat > '00'
;
endmethod.
endclass.
在上面的代码中,它通过必要的转换和过滤从远程表中读取数据。如果连接的是 SAP 系统,需要提到的一件事是 ABAP 客户端处理。在上面的示例中,我们在远程系统中将客户端固定为“910”。
创建CDS视图
@AbapCatalog.sqlViewName: 'ZICMRBSEGEV'
@EndUserText.label: 'ICMR Entry View Based on remote BSEG'
@ClientHandling.type: #CLIENT_DEPENDENT
@ClientHandling.algorithm: #SESSION_VARIABLE
@ObjectModel.usageType.serviceQuality: #X
@ObjectModel.usageType.dataClass: #MIXED
@ObjectModel.usageType.sizeCategory: #XL
@AbapCatalog.compiler.compareFilter:true
define view ZICMR_BSEG_ENTRY_VIEW
as select from ZICMR_TF as A
inner join finsc_fisc_date as B
on A.budat = B.calendar_date
{
A.rclnt,
A.method_id,
A.DOCNR,
A.DOCLN,
A.GRREF,
A.PSTAT,
A.CSTAT,
A.DUE_DATE,
A.CLEARING_STATUS,
A.rbukrs,
A.ref_belnr,
A.gjahr,
A.ref_docln,
B.fiscal_year as ryear,
B.fiscal_period as poper,
cast (B.fiscal_year_period as fis_jahrper_conv preserving type) as fiscyearper,
B.fiscal_year_variant as periv,
A.xopvw,
A.augdt,
A.augbl,
A.auggj,
A.bschl,
A.koart,
A.umskz,
@Semantics.currencyCode
A.rwcur,
@Semantics.amount.currencyCode: 'RWCUR'
A.wsl,
@Semantics.currencyCode
A.rhcur,
@Semantics.amount.currencyCode: 'RHCUR'
A.hsl,
A.zuonr,
A.sgtxt,
A.rcomp,
A.rassc,
A.racct,
A.lracct,
A.kunnr,
A.lifnr,
A.awtyp,
A.awkey,
A.awsys,
A.budat,
A.bldat,
A.blart,
A.xblnr,
A.bktxt,
A.xref1_hd,
A.xref2_hd,
A.usnam,
dats_tims_to_tstmp( A.cpudt,
A.cputm,
abap_system_timezone( $session.client,'NULL' ),
$session.client,
'NULL' ) as timestamp,
A.aedat,
A.bvorg,
A.xreversing,
A.xreversed
}
上面的 CDS 视图从表函数中读取数据。您可以加入其他 ABAP DDIC 表,并进行进一步的转换和过滤。在 CDS视图中,它与“FINSC_FISC_DATE”表连接,该表用于根据给定的会计年度变量将过帐日期转换为会计年度和期间。
成功激活CDS视图后,您可以对数据运行预览以进行检查。请通过添加必要的过滤器来避免读取过多的数据。否则,您可能会收到“内存不足”错误。
您可能会问是否可以匹配来自远程系统和 ICMR 服务器的组合数据。答案是肯定的。在上面的 CDS 视图脚本中,您可以通过直接从本地表 BSEG 中选择来合并来自 ICMR 服务器的数据。请参见下面的脚本示例:
define view ZICMR_BSEG_ENTRY_VIEW
as select from ZICMR_TF as A
inner join finsc_fisc_date as B
on A.budat = B.calendar_date
{
<field list>
}
union all
select from BSEG as A
inner join finsc_fisc_date as B
on A.budat = B.calendar_date
{
<field list>
}
ADBC进行增删改查
DATA: dbname type string value `"SAPHANADB"."ZAUD_FMS_COMPANY"`.
DATA: sql type ref to cl_sql_statement.
if wa_db-zsex is initial.
get time.
concatenate sy-uzeit+0(2) ':' sy-uzeit+2(2) ':'
sy-uzeit+4(2) into wa_db-zsex.
endif.
try.
create object sql.
sql->execute_update(
`INSERT INTO ` && dbname && ` ` &&
`VALUES ('`
&& wa_db-zid && `','`
&& wa_db-zname && `','`
&& wa_db-zsex && `')` ).
catch cx_sql_exception into err.
message err type 'I' display like 'E'.
endtry.
方法二: DROP语法将列存储表替换为虚拟表->OPEN SQL进行增删改查
首先SE11新建表定义
在命令窗口中输入DROP命令,注意需要指定库名
DROP TABLE SAPHANADB(库名).ZTABLE(表名)
DROP表操作后,SAP GUI端会显示数据库不存在该表,但屏幕还是会有相关信息。
原因是DIALOG中显示的数据是从相关底表(如DD02L,DD03L等)中取数的,而不是HANA端。
可以通过查看表属性来判断是列存储表还是虚拟表。
常见问题
1.虚拟表添加字段
中间库增加字段及SE11增加字段后,DROP表再重新创建虚拟表即可。
2.虚拟表还原为列存储表
首先DROP虚拟表
然后通过HANA SQL语句创建列存储表即可。
CREATE COLUMN TABLE "SAPHANADB"."ZAUD_FMS_COMPANY"(
"MANDT" NVARCHAR(3),
"BUKRS" NVARCHAR(4),
"ZFBUKRS" NVARCHAR(5),
"ZFTEXT" NVARCHAR(80),
"ZACT_FLG" NVARCHAR(1),
"ZCLASS" NVARCHAR(40),
"ZDATE" NVARCHAR(8),
"ZTIME" NVARCHAR(6),
"ZRS01" NVARCHAR(40),
"ZRS02" NVARCHAR(40),
"ZRS03" NVARCHAR(40),
primary key("MANDT","BUKRS","ZFBUKRS")
);
文章来自于网络,如果侵犯了您的权益,请联系站长删除!