CDS注释

CDS注释

🎯 CDS注解概述

==注解(Annotation)==用于向CDS实体添加元数据。它们由使用CDS实体的框架进行评估,指定实体的属性和语义及其在运行时访问时的行为。

当CDS源代码中定义的对象被激活时,注解定义的元数据保存在ABAP Dictionary的==内部数据库表==中。



graph TD
    A[CDS注解] --> B[ABAP目录注解]
    A --> C[访问控制注解]
    A --> D[文本注解]
    A --> E[语义注解]
    A --> F[对象模型注解]
    A --> G[聚合注解]
    A --> H[消费注解]
    A --> I[VDM/OData注解]
    A --> J[分析注解]
    A --> K[系统字段注解]

📋 系统常量

CDS视图中可以使用的==会话变量==:

常量 描述
$session.client SAP客户端
$session.system_date 系统时间(SY-DATUM)
$session.system_language SAP语言
$session.user 登录SAP的用户

🏗️ ABAP目录注解

@AbapCatalog.sqlViewName

1
@AbapCatalog.sqlViewName: '<SQL_VIEW_NAME>'
  • 描述:ABAP词典中CDS数据库视图的名称
  • 可能的值:最多==16个字符==的字符串
  • 注意:CDS视图的每个定义都==必须包含==此注解

@AbapCatalog.compiler.compareFilter

1
@AbapCatalog.compiler.compareFilter: '<VALUE>'
  • 描述:定义CDS视图路径表达式中过滤条件的评估
  • 可能的值truefalse

🔍 访问控制注解

@AccessControl.authorizationCheck

1
@AccessControl.authorizationCheck: '<VALUE>'
  • 描述:定义使用Open SQL访问CDS视图时的==隐式访问控制==
  • 可能的值
说明
#CHECK 有角色时执行访问控制,无角色时语法检查警告
#NOT_REQUIRED 类似#CHECK,但无警告
#NOT_ALLOWED 不执行访问控制
ℹ️CDS角色概念
CDS角色隐式映射到每个用户(映射角色)。访问条件包括:
  • 将CDS实体元素与==文字值==比较的文字条件
  • 将CDS实体元素与SAP==授权==关联的PFCG条件

📝 最终用户文本注解

@EndUserText.label

1
@EndUserText.label: '<String>'
  • 描述:CDS视图的==可翻译短文本==
  • 可能的值:最多40个字符的字符串
  • 源代码中指定的值应为CDS源代码原始语言的文本

💡 语义注解

语义注解用于通知客户端有关==数据类型==的信息,如电话号码、邮件地址、城市等。

文本和URL

注解 描述
@Semantics.text 人类可读文本 true / false
@Semantics.url URL字段 URL

货币代码和金额

注解 描述
@Semantics.currencyCode 标记包含货币代码的字段 true / false
@Semantics.amount.currencyCode 货币金额,引用货币代码字段 [ELEMENT, PARAMETER]

度量单位

注解 描述
@Semantics.unitOfMeasure 标记包含度量单位 true / false
@Semantics.quantity.unitOfMeasure 与测量数量相关的单位 [ELEMENT, PARAMETER]

🔍 对象模型注解

代表键和文本元素

1
@ObjectModel.representativeKey: '<名称键字段>'

代表键对应的外键字段代表实体。

1
@ObjectModel.text.element: ['<元素>']

建立字段与描述性文本的联系。

外键关联

1
@ObjectModel.foreignKey.association: '<名称键字段>'

定义与视图的关联,该视图表示带注释字段的值列表/检查表。

其他ObjectModel注解

注解 描述
@ObjectModel.readOnly 该CDS只读
@ObjectModel.association.type: [#TO_COMPOSITION_ROOT] 跳转到根页面
@ObjectModel.association.type: [#TO_COMPOSITION_CHILD] 跳转到子页面

📊 聚合注解

@DefaultAggregation

1
@DefaultAggregation: '<值>'
说明
SUM 求和
MAX / MIN 最大值 / 最小值
AVG 平均值
COUNT / COUNT_DISTINCT 计数
FORMULA 公式,不聚合
NONE 非度量,用于过滤器和GROUP BY

🏗️ 消费注解

@Consumption.filter

1
@Consumption.filter: '<值>'

可以过滤底层视图的元素。过滤器值由用户在UI上手动输入。

💡 VDM和OData注解

@VDM.viewType

1
@VDM.viewType: '<值>'
说明
BASIC 核心数据基础,无冗余
COMPOSITE 从BASIC视图派生和组合
CONSUMPTION 特定应用目的

@OData.publish

1
@OData.publish: true

当设置且CDS视图被激活时,==自动生成OData服务==。随后需要在事务 /IWFND/MAINT_SERVICE 中手动激活。

🔍 分析注解

@Analytics.dataCategory

1
@Analytics.dataCategory: '<值>'
说明
#DIMENSION 主数据视图
#FACT 事务数据(星型模式中心)
#CUBE 事实数据(允许冗余)
#AGGREGATIONLEVEL 投影(支持回写)

@Analytics.query

1
@Analytics.query: true

指定将向分析管理器暴露的视图。

@Analytics.dataExtraction.enabled

1
@Analytics.dataExtraction.enabled: true

标记适合数据复制的视图。

📋 系统字段注解

@Environment.systemField

1
2
3
4
5
6
7
8
@Environment.systemField: #CLIENT
p_mandt : syst_mandt,

@Environment.systemField: #SYSTEM_DATE
p_datum : syst_datum,

@Environment.systemField: #USER
p_uname : syst_uname

支持的系统字段:#CLIENT#SYSTEM_DATE#SYSTEM_TIME#SYSTEM_LANGUAGE#USER

💡隐式参数传递
在Open SQL中使用带注释的参数访问CDS视图时,可以==放弃显式参数传递==。Open SQL会隐式传递相应系统字段的内容。

示例:系统字段使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@AbapCatalog.sqlViewName: 'DEMO_CDS_SYST'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_system_fields
with parameters
@Environment.systemField: #CLIENT
p_mandt : syst_mandt,
@Environment.systemField: #SYSTEM_DATE
p_datum : syst_datum,
@Environment.systemField: #SYSTEM_LANGUAGE
p_langu : syst_langu,
@Environment.systemField: #USER
p_uname : syst_uname
as select from demo_expressions
{
:p_mandt as client,
:p_datum as datum,
:p_langu as langu,
:p_uname as uname
}
where id = '1'
1
2
3
4
5
6
7
8
9
10
11
12
" 使用OPEN SQL访问,参数是隐式传递的
SELECT *
FROM demo_cds_system_fields( )
INTO TABLE @DATA(result).

" 也可以显式传递参数(p_mandt除外)
SELECT *
FROM demo_cds_system_fields(
p_datum = @sy-datum,
p_langu = @sy-langu,
p_uname = @sy-uname )
INTO TABLE @DATA(result2).
⚠️注意
  • p_mandt 的值==不能再显式传递==
  • 隐式参数传递仅在Open SQL中可用
  • 在CDS实体中使用带参数的CDS实体时,必须==再次显式传递参数==