mcpField
S
sap-abap-cds

sap-abap-cds

github.com/secondsky数据与数据库480954 次安装3 周前更新
代码仓库

关于 sap-abap-cds

面向 ABAP 开发者的 CDS 视图参考技能,涵盖语法、注解、访问控制、版本差异与故障排查,适用于多个 ABAP 版本。

主要功能

  1. 01经典视图与视图实体
  2. 02关联与参数
  3. 03UI 和语义注解
  4. 04DCL 访问控制
  5. 05版本兼容性说明
  6. 06编译器错误排查

适用场景

  1. 01为 ABAP 应用创建 CDS 视图
  2. 02添加币种和数量语义
  3. 03定义关联和访问规则
  4. 04排查 CDS 编译问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/sap-skills --skill sap-abap-cds

安装后在 Claude Code 中输入/sap-abap-cds确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
agents/
openai.yaml
references/
access-control-reference.md
annotations-reference.md
associations-reference.md
expressions-reference.md
functions-reference.md
troubleshooting.md
templates/
basic-view.md
dcl-template.md
parameterized-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 SP87.507.517.55+
CDS 视图(DEFINE VIEW)xxxx
CDS 关联、参数、内置函数xxxx
CDS 表函数(DEFINE TABLE FUNCTION)xxx
CDS 访问控制(DEFINE ROLE / pfcg_auth)xxxx
CDS 访问控制(隐式评估)xxx
会话变量($session.user/client/system_language)xxxx
@Environment.systemField 注解xxx
UPPER/LOWER 函数xx
$session.system_datexx
CDS 元数据扩展(ANNOTATE VIEW)xx
CDS 中的 Cross Joinxx
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 视图基础知识

视图类型
类型语法数据库视图起始版本
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 设置
  1. 文件 → 新建 → 其他 → Core Data Services → Data Definition
  2. 输入名称、描述和包
  3. 选择模板(视图、视图实体等)

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 - 访问控制定义

源文档

请查阅以下内容以更新此技能:

上次验证时间:2026-04-02

评论

支持 Markdown