3. CDS视图入门与开发环境

在SAP S/4HANA中,CDS(Core Data Services)视图是嵌入式分析的核心建模对象。它并不是传统意义上的数据库视图,而是一段由ABAP CDS DDL(Data Definition Language)描述的、在ABAP层定义、由HANA数据库执行的语义化数据模型。要真正掌握CDS,第一步不是背语法,而是在正确的开发环境里亲手创建、激活并预览一个视图,理解“定义—激活—消费”这条链路。

开发环境:为什么是ADT而不是SE11

CDS视图的编辑、激活和预览都在ABAP Development Tools(ADT)中完成。ADT是Eclipse的插件,通过ABAP项目连接到S/4HANA系统。相比SE11/SE80,ADT提供了语法高亮、实时语法检查、注解补全、依赖导航和数据预览能力,这些对CDS开发几乎是必需的。使用前需要确认:Eclipse已安装ABAP Development Tools,已创建指向目标系统的ABAP项目,且当前用户拥有开发权限(如S_DEVELOP)和目标包(Package)的传输权限。

创建入口通常有两种:在项目树中右键目标包,选择 New → Other ABAP Repository Object → Core Data Services → Data Definition;或直接使用菜单 File → New → Data Definition。向导中需要填写三项关键信息:Package(如 ZCDS_DEMO)、Name(如 ZCDS_SALES_ORDER)、Description(如 销售订单概览视图)。名称建议遵循 Z 或 Y 开头的客户命名空间,长度不超过30字符。

DDL语法骨架:一个可运行的最小视图

向导生成的是一个带注解的模板。下面给出一个基于标准表 VBAK(销售订单抬头)的最小可用示例,用于演示语法结构:

@AbapCatalog.sqlViewName: 'ZCDS_SO_V'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '销售订单概览'
define view ZCDS_SALES_ORDER
  as select from vbak
{
  key vbak.vbeln as SalesOrder,
      vbak.erdat as CreatedDate,
      vbak.auart as OrderType,
      vbak.netwr as NetValue,
      vbak.waerk as Currency
}

逐层理解这段DDL:

  • 注解(Annotation):以 @ 开头,为视图提供元数据。@AbapCatalog.sqlViewName 指定底层数据库视图名(必须≤16字符,且与CDS名不同);@AccessControl.authorizationCheck 控制权限检查;@EndUserText.label 是给业务用户看的描述。
  • define view:声明一个CDS视图实体,后跟CDS名称。
  • as select from:指定数据来源,可以是单表、多表关联或其它CDS视图。
  • 选择列表:每个字段用 别名 as 输出名 的形式定义。key 关键字标记主键字段,这对后续关联和预览排序很重要。

需要特别注意:CDS视图名(ZCDS_SALES_ORDER)是ABAP层的逻辑名,sqlViewName(ZCDS_SO_V)是数据库层的物理名。两者不能相同,且sqlViewName一旦激活后被消费,修改需谨慎。

激活:从源码到可消费对象

编写完成后按 Ctrl+S 保存,再按 Ctrl+F3 激活。激活过程会触发语法检查、依赖解析和数据库对象生成。如果失败,Problems视图会给出具体行号和原因。常见错误包括:字段名拼写错误、sqlViewName重复或超长、注解值不合法、缺少必要的 @AccessControl 注解等。激活成功后,视图才会在数据字典中生成对应的SQL视图,才能被其它CDS或ABAP程序消费。

激活不是“保存”的同义词。未激活的CDS视图只存在于草稿中,不能被SELECT语句访问,也不会出现在数据预览里。

预览数据:验证建模结果

激活后,在ADT中右键视图名,选择 Open With → Data Preview,或直接按 F8。ADT会执行一条 SELECT 并展示前若干行数据。预览时重点观察三件事:字段是否按预期输出、主键字段是否唯一、数值和日期格式是否正确。如果预览报错“View not found”,通常是未激活或sqlViewName冲突;如果无数据,需检查来源表是否有数据以及是否有权限过滤。

CDS视图:定义 → 激活 → 预览 数据链路 ① DDL 定义(ADT编辑器) @AbapCatalog.sqlViewName @AccessControl.authorizationCheck define view ZCDS_SALES_ORDER as select from vbak { ... } 逻辑名 ≠ 物理名 ② 激活(Ctrl+F3) 语法检查 依赖解析 生成数据库SQL视图 写入ABAP数据字典 失败 → Problems视图定位 ③ 数据预览(F8) SELECT * FROM ZCDS_SO_V 观察字段输出 检查主键唯一性 验证数值/日期格式 无数据 → 查来源表/权限 ④ 消费方(激活后才可用) ABAP Open SQL:SELECT ... FROM zcds_sales_order 其它CDS视图关联 / 分析查询 / Fiori应用 关键注解速查 @AbapCatalog.sqlViewName:数据库物理视图名(≤16字符,必填) @AccessControl.authorizationCheck:#NOT_REQUIRED / #CHECK / #MANDATORY @EndUserText.label:业务描述,显示在Fiori和分析工具中

从示例到可复用:几个容易踩的坑

第一,sqlViewName 必须唯一且不超过16字符,很多初学者直接复制CDS名导致激活失败。第二,选择列表中的字段必须显式命名,不能只写 vbak.vbeln 而不给别名,否则输出字段名会变成技术名,影响后续消费。第三,如果来源表有客户端字段 MANDT,CDS会自动处理,不需要手动加入选择列表。第四,注解不是可选项,缺少 @AccessControl 时系统可能给出警告,建议从一开始就养成写全注解的习惯。

修改已激活视图的 sqlViewName 会导致底层数据库视图重建,已消费该视图的程序可能失效。生产系统中应通过传输请求管理变更,避免直接在生产客户端修改。

本节小结

创建第一个CDS视图的完整闭环是:在ADT中新建Data Definition → 编写DDL与注解 → 保存并激活 → 用数据预览验证输出。理解逻辑名与物理名的分离、注解的作用、激活与保存的区别,是后续学习关联、参数、聚合和权限控制的基础。建议读者亲手完成一次从建包到预览的全过程,并尝试修改选择列表增加一个字段,观察激活前后预览结果的变化。