CDS view与替代对象

一,简介

替代对象是指用一个CDS view指派给一个透明表或常规数据库视图,使得透明表或常规数据库视图的访问重定向到该CDS view。

替代有诸多要求:

      • 字段数量一致且同名对应,顺序可以不一致
      • 对应的字段数据类型长度等必须一致
      • CDS view不能带入参
      • 替代与Buffer不能共存

怎么知道一个透明表或视图被重定向了呢:

      • SE11 菜单【附加】--【替换对象】

CDS view与替代对象_第1张图片

      • SE16N 可见代理对象

CDS view与替代对象_第2张图片

      • 使用ST05来跟踪SQL
      • 在eclipse中打开这个透明表的DDL,看到如下注解,就表示存在重定向

CDS view与替代对象_第3张图片

二,重定向

在OpenSQL中的查询操作比如使用Select语句,或者Open cursor和Fetch,会重定向到CDS view。

还有一些情况不会重定向,仍指向透明表本身:

      • OpenSQL中的修改操作
      • 在Select语句中使用single for update
      • 在数据库层面使用:作为view的数据源,在数据库过程或数据库函数中访问

CDS view与替代对象_第4张图片

三,实例分析
3.1 诡异的数量查询

        定义如下CDS view发现取不到数据,将where子句去掉之后能取到数据,但数量【CLABS】全为0,而此时SE16N查数是正常的。我们发现MCHB重定向到nsdm_e_mchb这个CDS view,而它由mchb【表】与nsdm_e_mchb_diff【view】连接而来,且数量字段来自后者,所以mchb【表】里面数量字段真的是0,而我们下面自定义的这个view从mchb取数不会重定向,而是直接取mchb【表】,所以数量全是0。

@AbapCatalog.sqlViewName: 'ZCI_TEST'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Test'
define view ZTEST001_11 as select from mchb
{
    matnr,
    charg,
    lgort,
    werks,
    clabs
}
where clabs > 0
3.2 诡异的数量更改

        首先创建一个透明表,然后创建CDS,最后将透明表重定向到CDS。

        在SE16N中我们修改数量为3,保存后重新打开SE16N,发现数量显示13。查询显示时使用了重定向,取数逻辑来自CDS;修改保存则不走重定向,直接改底表。

//step-1 透明表
@AbapCatalog.replacementObject : 'ycds_test' //step-3 重定向到CDS
define table ytest_cl {
  key mandt : mandt not null;
  key docno : ebeln not null;
  quant     : menge_d;
}

//step-2 CDS view
@AbapCatalog.sqlViewName: 'YSQL_VIEW'
define view ycds_test
as select from ytest_cl
{ 
  mandt,
  docno,
  cast( quant + 10 as menge_d )  as quant
};

你可能感兴趣的:(SAP,sap,abap)