一,简介
替代对象是指用一个CDS view指派给一个透明表或常规数据库视图,使得透明表或常规数据库视图的访问重定向到该CDS view。
替代有诸多要求:
-
-
- 字段数量一致且同名对应,顺序可以不一致
- 对应的字段数据类型长度等必须一致
- CDS view不能带入参
- 替代与Buffer不能共存
-
怎么知道一个透明表或视图被重定向了呢:
-
-
- SE11 菜单【附加】--【替换对象】
-
-
-
- SE16N 可见代理对象
-
-
-
- 使用ST05来跟踪SQL
- 在eclipse中打开这个透明表的DDL,看到如下注解,就表示存在重定向
-
二,重定向
在OpenSQL中的查询操作比如使用Select语句,或者Open cursor和Fetch,会重定向到CDS view。
还有一些情况不会重定向,仍指向透明表本身:
-
-
- OpenSQL中的修改操作
- 在Select语句中使用single for update
- 在数据库层面使用:作为view的数据源,在数据库过程或数据库函数中访问
-
三,实例分析
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
};