CDS 概述

什么是 CDS

CDS(Core Data Service)是 SAP 推出的核心数据服务,是一种基于 SQL 的数据建模语言,用于在数据库层定义语义丰富的数据模型。CDS 不仅仅是一个视图定义,它提供了:

  • 语义层:在数据库层添加业务语义
  • 性能优化:计算下沉到数据库层执行
  • 代码复用:定义一次,多处使用
  • 权限控制:集成数据访问控制(DCL)
  • 元数据丰富:通过注解(Annotation)添加业务属性

CDS View 核心优势

1. 性能优化 - 计算下沉

  • 聚合、过滤、关联等操作在数据库层执行
  • 减少应用层与数据库层的数据传输
  • HANA 列式存储天然适合大规模计算

2. 按需加载 - Association

  • 传统 JOIN 立即加载所有关联表
  • CDS Association 按需触发,只在访问时才连接
  • 多表关联时性能提升显著

3. 代码复用 - 定义一次多处使用

  • 视图可被其他 CDS View 引用
  • 减少重复代码
  • 便于维护和修改

4. 语义丰富 - 注解机制

  • 添加业务语义(UI、搜索、权限)
  • 集成 Fiori Elements 自动化 UI
  • 支持 OData 服务自动生成

5. 权限控制 - DCL

  • 行级别权限控制
  • 与 SAP 权限对象集成
  • 数据安全性保障

6. 参数化支持

  • 动态传入参数
  • 提高查询灵活性
  • 减少视图数量

7. 标准化 - SAP 官方推荐

  • S/4HANA 标准基于 CDS 构建
  • 新功能优先支持 CDS
  • 未来发展方向

CDS View vs 传统 View

特性 CDS View 传统 View(SE11)
定义方式 DDL 源代码 图形化界面
存储位置 ABAP Dictionary ABAP Dictionary
关联方式 Association(按需) Join(立即)
参数支持 ✓ ✗
聚合函数 ✓ 有限
权限控制 DCL 有限
注解支持 ✓ ✗
计算下沉 ✓ ✗
性能 优 一般
复用性 高 低

实际应用场景

  • 报表取数优化
  • Fiori 应用数据层

CDS View 的两种语法

1. CDS View (经典语法)

@AbapCatalog.sqlViewName: 'ZSALES_SQL'
define view Z_SALES_ORDER
as select from vbak
{
key vbeln,
erdat,
netwr
}

2. CDS View Entity (新语法,推荐)

define view entity Z_SALES_ORDER
as select from vbak
{
key vbeln,
erdat,
netwr
}

新语法优势:

  • 不需要 @AbapCatalog.sqlViewName 注解
  • 不在数据库中创建 SQL View
  • 支持更多新特性
  • 性能更好

新语法优势:

  • 不需要 @AbapCatalog.sqlViewName 注解
  • 不在数据库中创建 SQL View
  • 支持更多新特性
  • 性能更好

CDS 基础语法

SELECT 语句

基本查询

define view entity Z_MATERIAL_LIST
as select from mara
{
key matnr, " 物料号
maktx, " 物料描述
mtart, " 物料类型
matkl, " 物料组
meins " 基本单位
}

指定字段别名

define view entity Z_MATERIAL_LIST
as select from mara
{
key matnr as Material,
maktx as Description,
mtart as MaterialType,
matkl as MaterialGroup,
meins as BaseUnit
}

使用表别名

define view entity Z_SALES_DETAIL
as select from vbak as h " 头表
inner join vbap as i " 行项目
on h.vbeln = i.vbeln
{
key h.vbeln as SalesOrder,
key i.posnr as Item,
h.erdat as CreatedOn,
i.matnr as Material,
i.netwr as NetValue
}

WHERE 条件

基本条件

define view entity Z_ACTIVE_MATERIALS
as select from mara
{
key matnr,
maktx,
mtart
}
where lvorm = ' ' " 未删除
and mtart = 'FERT' " 成品

参数化条件

define view entity Z_MATERIAL_BY_TYPE
with parameters
p_matnr : matnr,
p_mtart : mtart
as select from mara
{
key matnr,
maktx,
mtart
}
where matnr = $parameters.p_matnr
and mtart = $parameters.p_mtart

使用输入参数

define view entity Z_ORDERS_BY_DATE
with parameters
p_date_from : sydatum,
p_date_to : sydatum
as select from vbak
{
key vbeln,
erdat,
netwr
}
where erdat >= $parameters.p_date_from
and erdat <= $parameters.p_date_to

KEY 字段声明

单主键

define view entity Z_MATERIAL_KEY
as select from mara
{
key matnr, " 主键
maktx,
mtart
}

复合主键

define view entity Z_SALES_ORDER_KEY
as select from vbap
{
key vbeln, " 销售订单号
key posnr, " 行项目号
matnr, " 物料号
netwr " 净价值
}

preserveKey 注解(经典语法)

@AbapCatalog.sqlViewName: 'ZMATERIAL_SQL'
@AbapCatalog.preserveKey: true
define view Z_MATERIAL_KEY
as select from mara
{
key matnr,
maktx
}
  • preserveKey: true:SQL View 使用 CDS 定义的 Key
  • preserveKey: false:SQL View 使用数据库表的 Key

CDS 关联(ASSOCIATION)

ASSOCIATION 概述

ASSOCIATION 是 CDS 的核心特性之一,它定义了视图之间的关联关系。与传统 JOIN 不同,ASSOCIATION 是按需加载的,只有在访问关联数据时才会执行数据库连接。

优势

  1. 性能优化:避免不必要的表连接
  2. 代码简洁:定义一次,多处使用
  3. 语义清晰:明确表达业务关系
  4. 灵活访问:支持延迟加载

基本语法

定义 ASSOCIATION

define view entity Z_SALES_WITH_MATERIAL
as select from vbak as h
association [1..1] to vbap as _Items
on h.vbeln = _Items.vbeln
{
key h.vbeln as SalesOrder,
h.erdat as CreatedOn,
_Items.posnr as Item,
_Items.matnr as Material,
_Items.netwr as NetValue
}

关联基数

基数 含义 使用场景
[0..1] 最多关联一个 可选关联
[1..1] 只能一一对应 必须关联
[0..n] 关联任意数量 可选一对多
[1..n] 至少关联一个 必须一对多

示例:订单与行项目

define view entity Z_ORDER_WITH_ITEMS
as select from vbak as _Order
association [1..*] to vbap as _Items
on _Order.vbeln = _Items.vbeln
{
key _Order.vbeln as OrderNumber,
_Order.erdat as CreatedOn,
_Order.netwr as OrderValue,
_Items.posnr as ItemNumber,
_Items.matnr as Material,
_Items.kwmeng as Quantity
}

关联访问

路径表达式

" 访问关联数据
select from Z_SALES_WITH_MATERIAL
{
SalesOrder,
CreatedOn,
_Items.Material, " 通过路径表达式访问
_Items.NetValue
}

在 CDS View 中使用关联

define view entity Z_SALES_REPORT
as select from Z_SALES_WITH_MATERIAL as _Sales
{
key _Sales.SalesOrder,
_Sales.CreatedOn,
_Sales._Items.Material, " 访问关联
_Sales._Items.NetValue
}

多表关联

三层关联示例

define view entity Z_COMPLETE_SALES
as select from vbak as _Order
association [1..1] to kna1 as _Customer
on _Order.kunnr = _Customer.kunnr
association [1..*] to vbap as _Items
on _Order.vbeln = _Items.vbeln
association [0..1] to mara as _Material
on _Items.matnr = _Material.matnr
{
key _Order.vbeln as OrderNumber,
_Order.erdat as CreatedOn,
_Customer.name1 as CustomerName,
_Items.posnr as Item,
_Material.maktx as MaterialDesc,
_Items.netwr as NetValue
}

通过关联过滤

define view entity Z_SALES_BY_CUSTOMER
with parameters
p_kunnr : kunnr
as select from vbak as _Order
association [1..1] to kna1 as _Customer
on _Order.kunnr = _Customer.kunnr
{
key _Order.vbeln,
_Order.erdat,
_Customer.name1
}
where _Order.kunnr = $parameters.p_kunnr

Association vs Join

特性 Association Join
加载时机 按需加载 立即加载
性能 优 一般
代码复用 高 低
灵活性 高 低
适用场景 关联表可能不被访问 必须关联所有表

CDS 内置函数

字符串函数

CONCAT - 字符串拼接

define view entity Z_STRING_CONCAT
as select from mara
{
key matnr,
concat( matnr, maktx ) as full_desc,
concat( concat( matnr, ' - ' ), maktx ) as formatted_desc
}

SUBSTRING - 截取子串

define view entity Z_SUBSTRING_EXAMPLE
as select from mara
{
key matnr,
substring( matnr, 1, 4 ) as prefix, " 前4位
substring( matnr, 5, 10 ) as suffix " 从第5位开始取10位
}

UPPER / LOWER - 大小写转换

define view entity Z_CASE_EXAMPLE
as select from mara
{
key matnr,
upper( maktx ) as upper_desc,
lower( maktx ) as lower_desc
}

LENGTH - 字符串长度

define view entity Z_LENGTH_EXAMPLE
as select from mara
{
key matnr,
length( maktx ) as desc_length
}

REPLACE - 字符串替换

define view entity Z_REPLACE_EXAMPLE
as select from mara
{
key matnr,
replace( maktx, 'OLD', 'NEW' ) as replaced_desc
}

数学函数

ROUND - 四舍五入

define view entity Z_ROUND_EXAMPLE
as select from vbap
{
key vbeln,
key posnr,
netwr,
round( netwr, 0 ) as rounded_value, " 四舍五入到整数
round( netwr, 2 ) as rounded_2dec " 四舍五入到2位小数
}

CEIL / FLOOR - 向上/向下取整

define view entity Z_CEIL_FLOOR_EXAMPLE
as select from vbap
{
key vbeln,
key posnr,
netwr,
ceil( netwr ) as ceil_value, " 向上取整
floor( netwr ) as floor_value " 向下取整
}

ABS - 绝对值

define view entity Z_ABS_EXAMPLE
as select from bseg
{
key belnr,
key buzei,
dmbtr,
shkzg,
case shkzg
when 'S' then dmbtr
when 'H' then -dmbtr
end as signed_amount,
abs( dmbtr ) as absolute_amount
}

日期函数

当前日期/时间

define view entity Z_DATE_EXAMPLE
as select from vbak
{
key vbeln,
erdat,
$session.system_date as system_date, " 系统日期
$session.user_date as user_date " 用户日期
}

日期运算

define view entity Z_DATE_CALC
as select from vbak
{
key vbeln,
erdat,
dats_add_days( erdat, 30 ) as due_date, " 加30天
dats_add_months( erdat, 3 ) as quarter_end, " 加3个月
dats_days_between( erdat, $session.system_date ) as days_open
}

日期提取

define view entity Z_DATE_PARTS
as select from vbak
{
key vbeln,
erdat,
year( erdat ) as order_year,
month( erdat ) as order_month,
day( erdat ) as order_day
}

转换函数

CAST - 类型转换

define view entity Z_CAST_EXAMPLE
as select from mara
{
key matnr,
cast( matnr as char(20) ) as matnr_char,
cast( brgew as abap.dec(13,2) ) as weight_dec
}

类型转换函数

define view entity Z_CONVERSION_EXAMPLE
as select from mara
{
key matnr,
unit_conversion( quantity => 1,
source_unit => meins,
target_unit => 'KG' ) as weight_kg
}

COALESCE 函数

COALESCE 用于处理 NULL 值,提供默认值:

define view entity Z_COALESCE_EXAMPLE
as select from mara
{
key matnr,
coalesce( maktx, 'No Description' ) as material_desc,
coalesce( matkl, 'UNASSIGNED' ) as material_group
}

嵌套 COALESCE

define view entity Z_COALESCE_NESTED
as select from mara
{
key matnr,
coalesce( maktx,
coalesce( mfrpn, 'No Description' ) ) as desc_with_fallback
}

CDS 聚合与分组

聚合函数

常用聚合函数

函数 说明 示例
sum() 求和 sum( netwr )
count() 计数 count( * )
avg() 平均值 avg( netwr )
min() 最小值 min( netwr )
max() 最大值 max( netwr )

示例:销售汇总

define view entity Z_SALES_SUMMARY
as select from vbap
{
key vbeln as SalesOrder,
sum( netwr ) as TotalValue,
count( * ) as ItemCount,
avg( netwr ) as AvgItemValue,
min( netwr ) as MinItemValue,
max( netwr ) as MaxItemValue
}
group by vbeln

示例:物料统计

define view entity Z_MATERIAL_STATS
as select from mara
{
key mtart as MaterialType,
count( * ) as MaterialCount,
count( distinct matkl ) as GroupCount
}
group by mtart

GROUP BY 分组

单字段分组

define view entity Z_SALES_BY_YEAR
as select from vbak
{
key year( erdat ) as SalesYear,
sum( netwr ) as TotalValue,
count( * ) as OrderCount
}
group by year( erdat )

多字段分组

define view entity Z_SALES_BY_YEAR_MONTH
as select from vbak
{
key year( erdat ) as SalesYear,
key month( erdat ) as SalesMonth,
sum( netwr ) as TotalValue,
count( * ) as OrderCount
}
group by year( erdat ), month( erdat )

HAVING 条件

define view entity Z_HIGH_VALUE_ORDERS
as select from vbap
{
key vbeln as SalesOrder,
sum( netwr ) as TotalValue
}
group by vbeln
having sum( netwr ) > 10000

CASE 条件表达式

简单 CASE

define view entity Z_MATERIAL_TYPE_DESC
as select from mara
{
key matnr,
mtart,
case mtart
when 'FERT' then 'Finished Product'
when 'HALB' then 'Semi-Finished'
when 'ROH' then 'Raw Material'
when 'HALB' then 'Trading Goods'
else 'Other'
end as material_type_desc
}

搜索 CASE

define view entity Z_PRICE_CATEGORY
as select from vbap
{
key vbeln,
key posnr,
netwr,
case
when netwr >= 10000 then 'High'
when netwr >= 1000 then 'Medium'
when netwr >= 100 then 'Low'
else 'Micro'
end as price_category
}

CASE 与聚合结合

define view entity Z_SALES_BY_STATUS
as select from vbak
{
key vbeln,
sum( case when netwr > 0 then netwr else 0 end ) as positive_value,
sum( case when netwr < 0 then abs( netwr ) else 0 end ) as negative_value,
count( case when netwr > 0 then 1 end ) as positive_count
}
group by vbeln

CDS 参数化视图

输入参数定义

基本参数

define view entity Z_MATERIAL_BY_TYPE
with parameters
p_matnr : matnr,
p_mtart : mtart
as select from mara
{
key matnr,
maktx,
mtart
}
where matnr = $parameters.p_matnr
and mtart = $parameters.p_mtart

默认值参数

define view entity Z_ORDERS_DEFAULT_DATE
with parameters
p_date : sydatum default $session.system_date
as select from vbak
{
key vbeln,
erdat,
netwr
}
where erdat = $parameters.p_date

参数类型

define view entity Z_PARAM_TYPES
with parameters
p_char : char(10), " 字符型
p_numc : numc(10), " 数字字符型
p_int : abap.int4, " 整型
p_dec : abap.dec(13,2), " 小数型
p_date : sydatum, " 日期型
p_time : syuzeit, " 时间型
p_string : abap.string(100) " 字符串型
as select from mara
{
key matnr
}

参数使用场景

范围查询

define view entity Z_ORDERS_DATE_RANGE
with parameters
p_date_from : sydatum,
p_date_to : sydatum
as select from vbak
{
key vbeln,
erdat,
netwr
}
where erdat >= $parameters.p_date_from
and erdat <= $parameters.p_date_to

模糊查询

define view entity Z_MATERIAL_SEARCH
with parameters
p_search : char(40)
as select from mara
{
key matnr,
maktx,
mtart
}
where maktx like $parameters.p_search

在 ABAP 中调用参数化视图

DATA: lt_result TYPE TABLE OF zmaterial_by_type.

SELECT * FROM zmaterial_by_type( p_matnr = '000000000000000001',
p_mtart = 'FERT' )
INTO TABLE @lt_result.

CDS 视图组合

UNION - 合并查询

基本 UNION

define view entity Z_ALL_DOCUMENTS
as select from vbak
{
key vbeln as DocumentNumber,
'Sales Order' as DocumentType,
erdat as CreatedOn,
netwr as Value
}
union
select from likp
{
key vbeln as DocumentNumber,
'Delivery' as DocumentType,
erdat as CreatedOn,
0 as Value
}

UNION ALL

define view entity Z_ALL_MOVEMENTS
as select from mseg where shkzg = 'S'
{
key mblnr,
key zeile,
'Debit' as MovementType,
menge,
dmbtr
}
union all
select from mseg where shkzg = 'H'
{
key mblnr,
key zeile,
'Credit' as MovementType,
menge,
dmbtr
}

INTERSECT - 交集

define view entity Z_COMMON_MATERIALS
as select from marc where werks = '1000'
{
key matnr
}
intersect
select from marc where werks = '2000'
{
key matnr
}

EXCEPT - 差集

define view entity Z_ONLY_IN_PLANT_1000
as select from marc where werks = '1000'
{
key matnr
}
except
select from marc where werks = '2000'
{
key matnr
}

CDS 注解(Annotation)

注解概述

注解是 CDS 的元数据机制,用于向数据模型添加业务语义和 UI 信息。注解以 @ 开头,可以放在视图定义的不同位置。

常用注解分类

1. 目录注解

@AbapCatalog.sqlViewName: 'ZSALES_SQL'        " SQL View 名称(经典语法)
@AbapCatalog.preserveKey: true " 保留 Key 定义
@AbapCatalog.compiler.compareFilter: true " 比较过滤器

2. 数据库注解

@AbapCatalog.dataMaintenance: #RESTRICTED      " 数据维护限制
@AbapCatalog.viewEnhancementCategory: [#PROJECTION_LIST] " 视图增强类别

3. 权限注解

@AccessControl.authorizationCheck: #CHECK      " 权限检查
@AccessControl.authorizationCheck: #NOT_REQUIRED " 不需要权限检查
@AccessControl.authorizationCheck: #MANDATORY " 强制权限检查

4. 搜索注解

@Search.searchable: true                       " 可搜索
@Search.defaultSearchElement: true " 默认搜索元素
@Search.fuzziness.threshold: 0.8 " 模糊搜索阈值

5. UI 注解

@UI.headerInfo: { typeName: 'Sales Order', typeNamePlural: 'Sales Orders' }
@UI.lineItem: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]
@UI.dataPoint: { title: 'Net Value' }

6. 对象模型注解

@ObjectModel.representativeKey: 'SalesOrder'
@ObjectModel.usageType.serviceQuality: #X
@ObjectModel.usageType.sizeCategory: #S
@ObjectModel.usageType.dataClass: #TRANSACTIONAL

注解使用示例

完整的业务对象注解

@AbapCatalog.sqlViewName: 'ZSALES_HDR_SQL'
@AbapCatalog.preserveKey: true
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED

@Search.searchable: true
@ObjectModel.representativeKey: 'SalesOrder'

@UI.headerInfo: { typeName: 'Sales Order',
typeNamePlural: 'Sales Orders',
title: { value: 'SalesOrder' },
description: { value: 'CustomerName' } }

define view Z_SALES_ORDER_HEADER
as select from vbak as _Header
association [1..1] to kna1 as _Customer
on _Header.kunnr = _Customer.kunnr
{
@UI.lineItem: [{ position: 10, label: 'Sales Order' }]
@UI.selectionField: [{ position: 10 }]
key _Header.vbeln as SalesOrder,

@UI.lineItem: [{ position: 20, label: 'Created On' }]
@UI.selectionField: [{ position: 20 }]
_Header.erdat as CreatedOn,

@UI.lineItem: [{ position: 30, label: 'Customer' }]
@Customer.name1 as CustomerName,

@UI.lineItem: [{ position: 40, label: 'Net Value' }]
@UI.dataPoint: { title: 'Net Value' }
@Semantics.amount.currencyCode: 'Currency'
_Header.netwr as NetValue,

@Semantics.currencyCode: true
_Header.waerk as Currency
}

搜索注解示例

@Search.searchable: true
define view entity Z_SEARCHABLE_MATERIAL
as select from mara
{
@Search.defaultSearchElement: true
@Search.fuzziness.threshold: 0.7
key matnr as Material,

@Search.defaultSearchElement: true
@Search.fuzziness.threshold: 0.8
maktx as Description,

@Search.ranking: #HIGH
mtart as MaterialType
}

CDS 权限控制(DCL)

DCL 概述

Data Control Language (DCL) 用于定义 CDS 视图的数据访问权限。它与 CDS 视图配合使用,实现行级别的权限控制。

基本 DCL 定义

简单权限控制

@EndUserText.label: 'Sales Order Authorization'
define role Z_SALES_ORDER_AUTH
{
grant select on Z_SALES_ORDER_HEADER
where ( SalesOrg ) = aspect pfcg_auth( S_VBAK_VKO, VKORG );
}

多条件权限

define role Z_SALES_AUTH_MULTI
{
grant select on Z_SALES_ORDER_HEADER
where ( SalesOrg ) = aspect pfcg_auth( S_VBAK_VKO, VKORG )
and ( Division ) = aspect pfcg_auth( S_VBAK_SPART, SPART );
}

权限注解集成

@AccessControl.authorizationCheck: #CHECK
define view entity Z_SECURED_SALES
as select from vbak
{
key vbeln,
vkorg,
netwr
}

DCL 使用场景

基于组织架构的权限

define role Z_ORG_AUTH
{
grant select on Z_ORGANIZATIONAL_DATA
where ( CompanyCode ) = aspect pfcg_auth( F_BUKRS, BUKRS );
}

基于角色的权限

define role Z_ROLE_AUTH
{
grant select on Z_SENSITIVE_DATA
where ( DataCategory ) = aspect pfcg_auth( Z_DATA_CAT, CATEGORY );
}

CDS 性能优化

计算下沉

CDS 的核心优势是将计算下沉到数据库层执行,减少数据传输量。

聚合计算下沉

define view entity Z_SALES_AGGREGATE
as select from vbap
{
key vbeln as SalesOrder,
sum( netwr ) as TotalValue,
count( * ) as ItemCount,
avg( netwr ) as AvgValue
}
group by vbeln

条件计算下沉

define view entity Z_PRICE_WITH_DISCOUNT
as select from vbap
{
key vbeln,
key posnr,
netwr,
netwr * 0.9 as discounted_price, " 计算在数据库层
case
when netwr >= 10000 then 'High'
when netwr >= 1000 then 'Medium'
else 'Low'
end as price_category
}

关联优化

使用 Association 替代 Join

" 低效:立即加载所有关联
define view Z_BAD_EXAMPLE
as select from vbak
inner join vbap on vbak.vbeln = vbap.vbeln
inner join kna1 on vbak.kunnr = kna1.kunnr
{
vbak.vbeln,
vbap.posnr,
kna1.name1
}

" 高效:按需加载关联
define view entity Z_GOOD_EXAMPLE
as select from vbak as _Order
association [1..*] to vbap as _Items
on _Order.vbeln = _Items.vbeln
association [1..1] to kna1 as _Customer
on _Order.kunnr = _Customer.kunnr
{
key _Order.vbeln,
_Items.posnr,
_Customer.name1
}

减少字段传输

" 低效:传输所有字段
define view Z_ALL_FIELDS
as select from mara
{
*
}

" 高效:只选择需要的字段
define view entity Z_MINIMAL_FIELDS
as select from mara
{
key matnr,
maktx,
mtart
}

索引优化

使用索引字段过滤

define view entity Z_INDEXED_QUERY
as select from vbak
{
key vbeln,
erdat,
netwr
}
where vbeln like '100%' " 使用主键索引
and erdat = '20240101' " 使用日期索引

避免全表扫描

" 低效:全表扫描
define view Z_FULL_SCAN
as select from vbak
{
key vbeln,
netwr
}
where netwr > 0 " 非索引字段

" 高效:使用索引字段
define view entity Z_INDEX_SCAN
as select from vbak
{
key vbeln,
netwr
}
where vbeln = '1000000001' " 主键索引

CDS 最佳实践

1. 命名规范

视图命名

  • CDS View Entity: Z_<模块>_<描述> (例:Z_SD_SALES_ORDER)
  • SQL View: Z<描述>SQL (例:ZSALESORDSQL)
  • 接口视图: I_<描述> (例:I_SALESORDER)
  • 消费视图: C_<描述> (例:C_SALESORDER)

字段命名

  • 使用业务字段名,不要使用技术字段名
  • 使用有意义的别名
  • 保持一致性
" 好的命名
define view entity Z_SALES_ORDER
as select from vbak
{
key vbeln as SalesOrder,
erdat as CreatedOn,
kunnr as Customer,
netwr as NetValue
}

" 不好的命名
define view entity Z_SO
as select from vbak
{
key vbeln,
erdat,
kunnr,
netwr
}

2. 注解使用

必要的注解

@AbapCatalog.sqlViewName: 'ZSALES_SQL'           " 经典语法必需
@AbapCatalog.preserveKey: true " 明确 Key 定义
@AccessControl.authorizationCheck: #NOT_REQUIRED " 明确权限需求
@ObjectModel.representativeKey: 'SalesOrder' " 代表性键

UI 注解

@UI.headerInfo: { typeName: 'Sales Order', typeNamePlural: 'Sales Orders' }
@UI.lineItem: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]

3. 关联设计

合理使用 Association

" 好的设计:按需加载
define view entity Z_SALES_ORDER
as select from vbak as _Order
association [1..*] to vbap as _Items
on _Order.vbeln = _Items.vbeln
association [1..1] to kna1 as _Customer
on _Order.kunnr = _Customer.kunnr
{
key _Order.vbeln,
_Order.erdat,
_Items.posnr,
_Customer.name1
}

" 不好的设计:立即加载所有关联
define view Z_SALES_ORDER_BAD
as select from vbak
inner join vbap on vbak.vbeln = vbap.vbeln
inner join kna1 on vbak.kunnr = kna1.kunnr
{
vbak.vbeln,
vbap.posnr,
kna1.name1
}

4. 性能优化

避免 SELECT *

" 低效
define view Z_BAD
as select from mara
{
*
}

" 高效
define view entity Z_GOOD
as select from mara
{
key matnr,
maktx,
mtart
}

使用参数化视图

define view entity Z_PARAMETERIZED
with parameters
p_matnr : matnr
as select from mara
{
key matnr,
maktx
}
where matnr = $parameters.p_matnr

5. 代码组织

视图层次结构

基础视图(表关联)
↓
接口视图(业务字段)
↓
消费视图(UI 注解)

示例:销售订单视图层次

" 1. 基础视图:表关联
define view entity ZI_SALES_ORDER_BASE
as select from vbak as _Header
association [1..*] to vbap as _Items
on _Header.vbeln = _Items.vbeln
{
key _Header.vbeln,
_Header.erdat,
_Header.kunnr,
_Items.posnr,
_Items.matnr,
_Items.netwr
}

" 2. 接口视图:业务字段
define view entity ZI_SALES_ORDER
as select from ZI_SALES_ORDER_BASE
{
key vbeln as SalesOrder,
erdat as CreatedOn,
kunnr as Customer,
posnr as Item,
matnr as Material,
netwr as NetValue
}

" 3. 消费视图:UI 注解
@UI.headerInfo: { typeName: 'Sales Order' }
define view entity ZC_SALES_ORDER
as select from ZI_SALES_ORDER
{
@UI.lineItem: [{ position: 10 }]
key SalesOrder,
@UI.lineItem: [{ position: 20 }]
CreatedOn,
@UI.lineItem: [{ position: 30 }]
Customer,
@UI.lineItem: [{ position: 40 }]
Material,
@UI.lineItem: [{ position: 50 }]
NetValue
}

CDS 开发实践

开发环境配置

Eclipse ADT 安装

  1. 下载 Eclipse IDE
  2. 安装 ABAP Development Tools (ADT)
  3. 连接 SAP 系统
  4. 创建 ABAP 项目

创建 CDS View

  1. 右键项目 → New → Other ABAP Repository Object
  2. 选择 Core Data Services → Data Definition
  3. 输入名称和描述
  4. 选择模板
  5. 编写 DDL 源代码

调试技巧

查看生成的 SQL

  1. 打开 CDS View
  2. 按 F8 执行
  3. 查看 SQL 控制台
  4. 分析执行计划

性能分析

  1. 使用 ST05 SQL Trace
  2. 使用 SE30 Runtime Analysis
  3. 使用 SQL Monitor

常见问题解决

1. 字段映射错误

问题:字段类型不匹配
解决:使用 CAST 转换

cast( source_field as target_type ) as field_name

2. 关联数据重复

问题:一对多关联导致数据重复
解决:使用聚合或子查询

define view entity Z_NO_DUPLICATES
as select from vbak as _Order
association [0..1] to (
select from vbap
{
vbeln,
sum( netwr ) as total_value
}
group by vbeln
) as _Items on _Order.vbeln = _Items.vbeln
{
key _Order.vbeln,
_Items.total_value
}

3. 性能问题

问题:查询缓慢
解决:

  • 检查索引使用
  • 减少关联表数量
  • 使用参数化视图
  • 避免 SELECT *

参考资料

官方文档

学习资源

示例代码

工具

  • Eclipse ADT
  • SAP Business Application Studio
  • VS Code with ABAP Extensions