SAP CDS View基础语法

本文详细介绍了CDSView的基本语法,包括定义视图、DISTINCT操作、WHERE子句、Key字段声明、内置函数、CASE表达式、CAST转换和COALESCE函数的应用,为初学者提供入门指南。

很多同学对于CDS view感觉无从下手,本篇博客将介绍CDS View的基础语法,并附有示例。

1. 定义一个CDS View

用途:

创建一个CDS View

语法:

@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
define view ZDEMO_CDS_DDL
  as select from sbook
{
  carrid,
  connid
}

解释:

  • @AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL' 指定了数据库SQL View的名字,在CDS View激活时,会在数据库层生成对应的SQL View
  • define view ZDEMO_CDS_DDL是定义的CDS View的名字
  • as select from sbook指定了CDS View的数据源,此处的数据源是DB Table sbook
  • { }中定义了CDS view中包含哪些字段

运行效果:

2. Select Distinct 

用途:

如果结果集中有重复的条目,DISTINCt可排除结果集中的重复条目。

语法:

@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
define view ZDEMO_CDS_DDL
  as select distinct from sbook
{
  carrid,
  connid
}

解释:

  • as select distinct from sbook指定了CDS View的数据源,此处的数据源是DB Table sbook

运行效果:

3. Where语句

用途:

限定筛选条件

语法:


@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
define view ZDEMO_CDS_DDL
  as select from sbook
{
  carrid,
  connid
}
where carrid = 'AA'

运行效果:

4. Key 字段声明

用途:

指定CDS View中哪些字段是Key字段

语法:


@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
@AbapCatalog.preserveKey: true
define view ZDEMO_CDS_DDL
  as select from sbook
{
  key carrid,
  key connid,
      fldate,
      bookid,
      customid,
      custtype
}

解释:

  • @AbapCatalog.preserveKey: true 这句annotation 的值为TRUE时,SQL view中的key字段使用CDS中定义的key; 值为FALSE时,使用DB table中table的key field.

运行效果:

5. Build-in 函数

用途:

CDS中自带的一些运算函数

语法:


@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
@AbapCatalog.preserveKey: true
define view ZDEMO_CDS_DDL
  as select from sbook
{
  key carrid,
  key connid,
      concat( carrid, connid ) as flightno,
      order_date,
      concat( concat (substring(order_date,5,2),'-'),
      substring(order_date,1,4) ) as ordermonth
}

解释:

  • concat () 拼接两个字符串,substring( )获取字符串中的一个子串。
  • 更多可用的Build-in函数可以查找ABAP的帮助文档

运行效果:

6. CASE表达式

用途:

实现分支运算

语法:

@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
@AbapCatalog.preserveKey: true
define view ZDEMO_CDS_DDL
  as select from sbook
{
  key carrid,
  key connid,
      case carrid
            when 'AA' then 'American Airlines'
            when 'AB' then 'Air Berlin'
            when 'UA' then 'United Airlines'
            else 'Other Airlines'
            end as airline_name,
      class,
      case
         when class = 'F' then 'First Class'
         when class = 'Y' then 'Business Class'
         else 'others'
         end    as class_level
}

解释:

  • case...when...else...end as 构成分支运算的逻辑
  • when语句中可以是逻辑表达式

运行效果:

7. CAST表达式

用途:

强制类型转换

语法:

@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
@AbapCatalog.preserveKey: true
define view ZDEMO_CDS_DDL
  as select from sbook
{
  key carrid,
  key connid,
      forcurkey,
      forcuram as origin_amount,
      case smoker
            when 'X' then cast ( forcuram as abap.fltp ) * 1.3
            else          cast ( forcuram as abap.fltp ) * 0.9
       end as final_amount
 
}

解释:

  • CAST可以完成所需要的强制类型转换,进而实现在CDS中的运算需求;其中abap.fltp代表转换为abap中的浮点型

运行效果:

8. COALESCE函数

用途:

常用用户处理NULL的状况,为NULL语设定默认值

语法:


@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
@AbapCatalog.preserveKey: true
define view ZDEMO_CDS_DDL
  as select from sbook
{
  key carrid,
  key connid,
      coalesce( smoker,  'unassigned') as somker_status
}

解释:

  • coalesce(arg1, arg2): 如果arg1不为NULL则返回arg1的值,否则返回arg2的值

小结:

在本文中,我们介绍了SAP CDS View的最基本的运算语法,有关运算过程中遇到的问题,可以进一步根据ABAP 中的帮助文档,查看相关的用法。

<think>我们正在处理用户关于SAPCDSViews的深度解析与高级用法的请求。根据提供的引用内容,我们可以整合相关信息并扩展。引用[1]提到了SAPABAP编程基础,其中包含CDSView作为ABAP的重要部分。引用[2]详细说明了CDSView的依赖分析器(DependencyAnalyzer)如何工作,它通过分析CDSView生成的SQL定义的静态语法树来识别数据源及其关系。引用[3]则涉及CDSView在授权控制(DCL)方面的应用,包括多维度过滤、调试方法(SE16N、SU53)、版本兼容性(NetWeaver7.40SP05起支持DCL,7.50后图形化维护)以及Fiori应用中的授权问题。因此,我们可以围绕以下方面进行深度解析:1.CDSView的核心概念与基本结构2.CDSView的高级功能(如关联、聚合、参数、注释等)3.CDSView的授权控制(DCL)4.CDSView的依赖分析与性能优化5.CDSView在Fiori中的应用及常见问题我们将按照这些方面组织内容,并确保使用正确的LaTeX格式(行内公式用$...$,独立公式用$$...$$并单独成段),同时使用中文回答。注意:由于引用内容有限,我们会在已有信息基础上进行合理扩展,确保内容真实可靠(基于SAP官方文档的常见知识)。最后,根据要求生成相关问题。</think>### SAP CDS Views 深度解析与高级用法 #### 一、CDS View 核心架构 1. **定义与结构** CDS(Core Data Services)是SAP ABAP中基于SQL的建模框架,其核心结构包含: ```abap @AbapCatalog.sqlViewName: 'ZSQL_VIEW' define view ZCDS_View as select from sflight { key carrid, key connid, sum(price) as total_price } where carrid in $parameters.p_carrid ``` 通过`@`注解控制运行时行为(如缓存策略),`define view`声明实体,`$parameters`实现动态过滤[^2]。 2. **关联分析** 支持多层级关联(`association [0..*] to`)和路径表达式: ```abap _Booking.connection._Airline.name // 跨视图导航 ``` 依赖分析器通过**静态语法树遍历**识别跨视图的数据源依赖关系[^2]。 --- #### 二、高级开发技巧 1. **参数化视图** 使用`with parameters`实现运行时动态过滤: ```abap define view ZParam_View with parameters p_date : abap.dats as select ... where flightdate > $parameters.p_date ``` 2. **DCL授权控制** ```abap define role ZFlight_Role { grant select on ZCDS_View where (carrid) = aspect pfcg_auth( S_CARRID ) and (connid) = aspect pfcg_auth( S_CONNID ); } ``` **调试方法**: - `SE16N`查看SQL视图执行结果 - `SU53`检查缺失的授权对象[^3] 3. **OData服务发布** 通过注解`@OData.publish: true`将CDS View直接暴露为Fiori服务,需激活S_SERVICE授权[^3]。 --- #### 三、性能优化策略 1. **缓存机制** 利用注解控制缓存策略: ```abap @AbapCatalog.analytic: true // 启用列式存储 @ObjectModel.cdsQuery: { implementation: #WITH_PARAMETERS } ``` 2. **分区剪裁** 在WHERE子句中使用分区键: ```sql WHERE mandt = $session.client AND year = $parameters.p_year ``` 可减少50%+的数据扫描量(SAP HANA优化指南)。 3. **避免N+1查询** 使用`LEFT OUTER JOIN`替代多次SELECT,通过`EXPLAIN PLAN`验证执行路径。 --- #### 四、版本兼容性 | 功能 | 最低支持版本 | 关键限制 | |--------------------|------------------|--------------------------| | DCL基础支持 | NetWeaver 7.40 SP05 | 仅代码维护 | | 图形化DCL编辑器 | NetWeaver 7.50 | 需Eclipse ADT | | CDS View扩展字段 | S/4HANA 2020 | 需启用扩展框架 | --- #### 五、调试与运维 1. **依赖分析** 使用`CDS_ANALYZER`工具解析视图依赖树,识别循环引用。 2. **性能追踪** ```abap CL_CDS_PERFORMANCE_ANALYZER=>start_trace( ). SELECT * FROM zcds_view... CL_CDS_PERFORMANCE_ANALYZER=>show_trace( ). ``` 3. **Fiori集成问题定位**: - Catalog未显示:检查角色分配和ICF节点激活状态 - 数据缺失:验证DCL条件拼接(`SE16N`查看SQL视图)[^3] > **最佳实践**:对于跨公司代码的复合视图,建议拆分为基础视图+消费视图,通过`@VDM.viewType: #CONSUMPTION`隔离业务逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值