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视图路径表达式中过滤条件的评估
可能的值 :true 或 false
🔍 访问控制注解 @AccessControl.authorizationCheck 1 @AccessControl.authorizationCheck: '<VALUE>'
描述 :定义使用Open SQL访问CDS视图时的==隐式访问控制==
可能的值 :
值
说明
#CHECK
有角色时执行访问控制,无角色时语法检查警告
#NOT_REQUIRED
类似#CHECK,但无警告
#NOT_ALLOWED
不执行访问控制
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
值
说明
BASIC
核心数据基础,无冗余
COMPOSITE
从BASIC视图派生和组合
CONSUMPTION
特定应用目的
@OData.publish
当设置且CDS视图被激活时,==自动生成OData服务==。随后需要在事务 /IWFND/MAINT_SERVICE 中手动激活。
🔍 分析注解 @Analytics.dataCategory 1 @Analytics.dataCategory: '<值>'
值
说明
#DIMENSION
主数据视图
#FACT
事务数据(星型模式中心)
#CUBE
事实数据(允许冗余)
#AGGREGATIONLEVEL
投影(支持回写)
@Analytics.query
指定将向分析管理器暴露的视图。
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实体时,必须==再次显式传递参数==