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端。
在这里插入图片描述
可以通过查看表属性来判断是列存储表还是虚拟表。
在这里插入图片描述在这里插入图片描述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")
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值