SAP HANA SDA实战

您所在的位置:网站首页 数据库虚拟表怎么用 SAP HANA SDA实战

SAP HANA SDA实战

2024-07-15 11:51| 来源: 网络整理| 查看: 265

什么是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 { } union all select from BSEG as A inner join finsc_fisc_date as B on A.budat = B.calendar_date { }

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端。 在这里插入图片描述 可以通过查看表属性来判断是列存储表还是虚拟表。 在这里插入图片描述在这里插入图片描述DROP表后创建同名虚拟表即可完成替换,后续使用OPEN SQL语法修改表后,会同步映射到外部数据库。

常见问题

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") );


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3