关于 sap-abap-cds
面向 ABAP 开发者的 CDS 视图参考技能,涵盖语法、注解、访问控制、版本差异与故障排查,适用于多个 ABAP 版本。
主要功能
- 01经典视图与视图实体
- 02关联与参数
- 03UI 和语义注解
- 04DCL 访问控制
- 05版本兼容性说明
- 06编译器错误排查
适用场景
- 01为 ABAP 应用创建 CDS 视图
- 02添加币种和数量语义
- 03定义关联和访问规则
- 04排查 CDS 编译问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ secondsky/ sap-skills --skill sap-abap-cds安装后在 Claude Code 中输入/sap-abap-cds确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdagents/openai.yamlreferences/access-control-reference.mdannotations-reference.mdassociations-reference.mdexpressions-reference.mdfunctions-reference.mdtroubleshooting.mdtemplates/basic-view.mddcl-template.mdparameterized-view.md详细介绍
SAP ABAP CDS(核心数据服务)
相关技能
- sap-abap:用于 CDS 中使用的 ABAP 编程模式,或在 ABAP 中实现 EML 语句时
- sap-btp-cloud-platform:用于 BTP 上的 CDS 部署场景或 ABAP Environment 配置
- sap-fiori-tools:用于构建使用 CDS 视图的 Fiori Elements 应用,或处理 UI 注解时
- sap-cap-capire:用于比较 ABAP 和 CAP 之间的 CDS 语法,或将 ABAP CDS 与 CAP 服务集成时
- sap-api-style:用于编写基于 CDS 的 OData 服务文档,或遵循 API 文档标准时
适用场景
在创建 ABAP CDS 视图或视图实体、定义关联和基数、添加 UI 或语义注解、实现 DCL 访问控制、处理货币/单位字段、排查 CDS 编译器错误,或比较传统 CDS 视图与较新的视图实体时,请使用此技能。
快速参考:https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abencds.html | SAP 备忘单:https://github.com/SAP-samples/abap-cheat-sheets/blob/main/15_CDS_View_Entities.md
版本兼容性
此技能涵盖从 7.40 SP8 到 ABAP Cloud 的 CDS 功能。主要版本边界:
| 功能 | 7.40 SP8 | 7.50 | 7.51 | 7.55+ |
|---|---|---|---|---|
CDS 视图(DEFINE VIEW) | x | x | x | x |
| CDS 关联、参数、内置函数 | x | x | x | x |
CDS 表函数(DEFINE TABLE FUNCTION) | x | x | x | |
| CDS 访问控制(DEFINE ROLE / pfcg_auth) | x | x | x | x |
| CDS 访问控制(隐式评估) | x | x | x | |
会话变量($session.user/client/system_language) | x | x | x | x |
@Environment.systemField 注解 | x | x | x | |
UPPER/LOWER 函数 | x | x | ||
$session.system_date | x | x | ||
CDS 元数据扩展(ANNOTATE VIEW) | x | x | ||
| CDS 中的 Cross Join | x | x | ||
CDS 视图实体(DEFINE VIEW ENTITY) | x | |||
新基数语法(to one/to many) | 7.57+ |
在 7.40 系统上:使用 DEFINE VIEW(而非 DEFINE VIEW ENTITY)。7.50 之前不支持 CDS 表函数。基本 DCL(使用 pfcg_auth 的 DEFINE ROLE)从 7.40 SP08 起可用,但在 ABAP SQL 中隐式评估角色需要 7.50 或更高版本。
$session.user/client/system_language 从 7.40 SP08 起可用。
templates/ 中的模板包含传统 CDS 视图和视图实体两种变体。
目录
- 1. CDS 视图基础知识
- 2. 重要注解
- 3. 表达式和运算
- 4. 内置函数
- 5. 连接
- 6. 关联
- 7. 输入参数
- 8. 聚合表达式
- 9. 访问控制(DCL)
- 10. 从 ABAP 中检索数据
- 11. 常见错误及解决方案
- 12. 实用事务和表
- 捆绑资源
- 源文档
1. CDS 视图基础知识
视图类型
| 类型 | 语法 | 数据库视图 | 起始版本 |
|---|---|---|---|
| CDS 视图 | DEFINE VIEW | 是 | 7.4 SP8 |
| CDS 视图实体 | DEFINE VIEW ENTITY | 否 | 7.55 |
建议:新开发请使用 CDS 视图实体。
基本 CDS 视图语法
@AbapCatalog.sqlViewName: 'ZCDS_EXAMPLE_V'
@AbapCatalog.compiler.CompareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Example CDS View'
define view ZCDS_EXAMPLE
as select from db_table as t
{
key t.field1,
t.field2,
t.field3 as AliasName
}
CDS 视图实体语法(7.55+)
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Example View Entity'
define view entity Z_CDS_EXAMPLE
as select from db_table as t
{
key t.field1,
t.field2,
t.field3 as AliasName
}
主要区别:视图实体省略 @AbapCatalog.sqlViewName——不会生成 SQL 视图。
Eclipse ADT 设置
- 文件 → 新建 → 其他 → Core Data Services → Data Definition
- 输入名称、描述和包
- 选择模板(视图、视图实体等)
2. 基本注解
核心注解
CDS 开发必备注解:
@AbapCatalog.sqlViewName- SQL 视图名称(最多 16 个字符)@AbapCatalog.compiler.CompareFilter- 优化 WHERE 子句@AccessControl.authorizationCheck- 设置为 #NOT_REQUIRED、#CHECK、#MANDATORY 或 #NOT_ALLOWED@EndUserText.label- 面向用户的描述@Metadata.allowExtensions- 允许扩展视图
完整参考:请参阅 references/annotations-reference.md,其中包含 50 多个注解及示例。
语义注解(货币/数量)
CURR 和 QUAN 数据类型必需,可避免错误 SD_CDS_ENTITY105:
-- Currency fields
@Semantics.currencyCode: true
waers,
@Semantics.amount.currencyCode: 'waers'
amount,
-- Quantity fields
@Semantics.unitOfMeasure: true
meins,
@Semantics.quantity.unitOfMeasure: 'meins'
quantity
UI 注解(Fiori Elements)
@UI.lineItem: [{ position: 10 }]
@UI.identification: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]
field1,
@UI.hidden: true
internal_field
消费注解(值帮助)
@Consumption.valueHelpDefinition: [{
entity: { name: 'I_Currency', element: 'Currency' }
}]
waers
完整的注解参考,请参阅 references/annotations-reference.md。
3. 表达式和运算
CASE 表达式
简单 CASE(比较单个变量):
case status
when 'A' then 'Active'
when 'I' then 'Inactive'
else 'Unknown'
end as StatusText
搜索式 CASE(多个条件):
case
when amount > 1000 then 'High'
when amount > 100 then 'Medium'
else 'Low'
end as AmountCategory
比较运算符
标准运算符:=、<>、<、>、<=、>=
特殊运算符:BETWEEN x AND y、LIKE、IS NULL、IS NOT NULL
完整参考:请参阅 references/expressions-reference.md,了解所有运算符和表达式。
算术运算
quantity * price as TotalAmount,
amount / 100 as Percentage,
-amount as NegatedAmount
会话变量
可用的系统变量(等同于 SY 字段):
$session.user(SY-UNAME)- 当前用户 [7.40 SP08+]$session.client(SY-MANDT)- 客户端 [7.40 SP08+]$session.system_language(SY-LANGU)- 语言 [7.40 SP08+]$session.system_date(SY-DATUM)- 当前日期 [7.51+]
注意:
$session.user/client/system_language从 7.40 SP08 起可用。$session.system_date需要 7.51+。@Environment.systemField需要 7.50+。
完整参考:请参阅 references/expressions-reference.md,了解所有系统变量。
$session.user as CurrentUser,
$session.system_date as Today
4. 内置函数
CDS 提供全面的内置函数,用于字符串、数值和日期运算。
主要函数类别
- 字符串函数:concat()、length()、substring()、upper()、lower()、replace()
- 数值函数:abs()、ceil()、floor()、round()、division()
- 日期函数:dats_add_days()、dats_add_months()、dats_days_between()
- CAST 表达式:在 ABAP 数据类型之间转换
注意:CDS 中的
upper()和lower()需要 7.51+。在 7.40/7.50 上,大小写 转换必须在选取数据后于 ABAP 中执行(CDS 中没有对应功能)。
完整参考:请参阅 references/functions-reference.md,其中包含 50 多个函数及示例。
快速示例
-- String operations
concat(first_name, last_name) as FullName,
upper(name) as UpperName,
substring(description, 1, 10) as ShortDesc
-- Numeric operations
abs(amount) as AbsoluteAmount,
round(value, 2) as RoundedValue,
division(10, 3, 2) as PreciseDivision
-- Date operations
dats_add_days(current_date, 7) as NextWeek,
dats_days_between(start_date, end_date) as Duration
-- Type conversion
cast(field as abap.char(10)) as TextField,
cast(amount as abap.curr(15,2)) as CurrencyField
**ABAP Types**: `abap.char()`, `abap.numc()`, `abap.int4`, `abap.dats`, `abap.tims`, `abap.curr()`, `abap.cuky`, `abap.quan()`, `abap.unit()`
---
## 5. Joins
### Join Types
```sql
-- INNER JOIN (matching rows only)
inner join makt as t on m.matnr = t.matnr
-- LEFT OUTER JOIN (all from left, matching from right)
left outer join marc as c on m.matnr = c.matnr
-- RIGHT OUTER JOIN (all from right, matching from left) -- [7.51+]
right outer join mvke as v on m.matnr = v.matnr
-- CROSS JOIN (cartesian product) -- [7.51+]
cross join t001 as co
6. 关联
关联定义实体之间的关系(按需联接):
定义关联
define view Z_ASSOC_EXAMPLE as select from scarr as c
association [1..*] to spfli as _Flights
on $projection.carrid = _Flights.carrid
association [0..1] to sairport as _Airport
on $projection.hub = _Airport.id
{
key c.carrid,
c.carrname,
c.hub,
// Expose associations
_Flights,
_Airport
}
基数表示法
语法对应关系:
[0..1]或[1]→association to one(LEFT OUTER MANY TO ONE)[1..1]→association to one(精确匹配)[0..*]或[*]→association to many(LEFT OUTER MANY TO MANY)[1..*]→association to many(一个或多个)
完整参考:请参阅 references/associations-reference.md,了解详细的基数指南。
新基数语法(Release 2302+)
association to one _Customer on ... -- [0..1]
association to many _Items on ... -- [0..*]
使用关联
-- Expose for consumer use
_Customer,
-- Ad-hoc field access (triggers join)
_Customer.name as CustomerName
带筛选条件的路径表达式
-- Filter with cardinality indicator
_Items[1: Status = 'A'].ItemNo
完整的关联参考,请参阅 references/associations-reference.md。
7. 输入参数
定义参数
define view Z_PARAM_EXAMPLE
with parameters
p_date_from : dats,
p_date_to : dats,
@Environment.systemField: #SYSTEM_LANGUAGE
p_langu : spras
as select from vbak as v
{
key v.vbeln,
v.erdat,
v.erzet
}
where v.erdat between :p_date_from and :p_date_to
参数引用
使用冒号表示法 :p_date_from 或 $parameters.p_date_from
从 ABAP 调用:
SELECT * FROM z_param_example(
p_date_from = '20240101',
p_date_to = '20241231',
p_langu = @sy-langu
) INTO TABLE @DATA(lt_result).
8. 聚合表达式
聚合函数
define view Z_AGG_EXAMPLE as select from vbap as i
{
i.vbeln,
sum(i.netwr) as TotalAmount,
avg(i.netwr) as AvgAmount,
max(i.netwr) as MaxAmount,
min(i.netwr) as MinAmount,
count(*) as ItemCount
}
group by i.vbeln
having sum(i.netwr) > 1000
9. 访问控制(DCL)
基本 DCL 结构
@MappingRole: true
define role Z_CDS_EXAMPLE_DCL {
grant select on Z_CDS_EXAMPLE
where (bukrs) = aspect pfcg_auth(F_BKPF_BUK, BUKRS, ACTVT = '03');
}
授权检查选项
可用值:
#NOT_REQUIRED- 不检查授权#CHECK- 如果不存在 DCL,则发出警告#MANDATORY- 如果不存在 DCL,则报错#NOT_ALLOWED- 如果存在 DCL,则忽略
完整参考:详细的 DCL 模式请参阅 references/access-control-reference.md。
条件类型
PFCG 授权:where (field) = aspect pfcg_auth(AUTH_OBJECT, AUTH_FIELD, ACTVT = '03')
字面值条件:where status <> 'DELETED'
用户方面:where created_by ?= aspect user
组合条件:where (bukrs) = aspect pfcg_auth(...) and status = 'ACTIVE'
完整的访问控制参考请参阅 references/access-control-reference.md。
10. 从 ABAP 检索数据
标准 SELECT
SELECT * FROM zcds_example
WHERE field1 = @lv_value
INTO TABLE @DATA(lt_result).
SALV IDA(集成数据访问)
cl_salv_gui_table_ida=>create_for_cds_view(
CONV #( 'ZCDS_EXAMPLE' )
)->fullscreen( )->display( ).
11. 常见错误及解决方案
SD_CDS_ENTITY105:缺少引用信息
问题:CURR/QUAN 字段没有引用
解决方案:添加语义注解
@Semantics.currencyCode: true
waers,
@Semantics.amount.currencyCode: 'waers'
netwr
或者从相关表导入货币:
inner join t001 as c on ...
{
c.waers,
@Semantics.amount.currencyCode: 'waers'
v.amount
}
基数警告
问题:基数与实际数据不匹配
解决方案:定义与数据模型相符的基数
association [0..1] to ... -- Use for optional relationships
association [1..*] to ... -- Use for required one-to-many
完整的故障排除指南请参阅 references/troubleshooting.md。
12. 实用事务和表
关键事务
- SDDLAR - 显示/修复 DDL 结构
- RSRTS_ODP_DIS - 预览 TransientProvider
- RSRTS_QUERY_CHECK - 验证 CDS 查询元数据
- SE63 - 翻译(EndUserText)
- SE11 - ABAP 字典
- SU21 - 授权对象
重要表
- DDHEADANNO - 标题级注解
- CDSVIEWANNOPOS - CDS 视图标题注解
- CDS_FIELD_ANNOTATION - 字段级注解
- ABDOC_CDS_ANNOS - SAP 注解定义
API 类
CL_DD_DDL_ANNOTATION_SERVICE - 以编程方式访问注解:
get_annos()- 获取所有注解get_label_4_element()- 获取 @EndUserText.label
捆绑资源
参考文档
详细指南请参阅 references/ 中的参考文件:
annotations-reference.md- 完整注解目录functions-reference.md- 所有内置函数及示例associations-reference.md- 关联和基数指南access-control-reference.md- DCL 和授权模式expressions-reference.md- 表达式和运算符troubleshooting.md- 常见错误及解决方案
模板
模板请参阅 templates/:
basic-view.md- 标准 CDS 视图模板parameterized-view.md- 带输入参数的视图dcl-template.md- 访问控制定义
源文档
请查阅以下内容以更新此技能:
- https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abencds.html (ABAP Cloud)
- https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/index.htm (7.40 Reference)
- https://help.sap.com/docs/SAP_NETWEAVER_AS_ABAP_752/f2e545608079437ab165c105649b89db/7c078765ec6d4e6b88b71bdaf8a2bd9f.html (NetWeaver 7.52 User Guide)
- https://github.com/SAP-samples/abap-cheat-sheets
- https://github.com/SAP-samples/abap-cheat-sheets/blob/main/33_ABAP_Release_News.md (Release News)
上次验证时间:2026-04-02