在 CDS 视图中调用内置函数
学习目标
使用 ABAP CDS 中的内置函数。
使用会话变量。
CDS 中的内置功能 - 概览
ABAP SQL 中的内置函数

现在您了解到可以完全相同的方式在 ABAP SQL 和 ABAP CDS 中使用表达式,内置函数呢?是否也可以在 ABAP CDS 中使用它们?
下面,我们来详细了解一下。

数字函数
对于所有数字函数,答案均为"是"。ABAP CDS 也支持这些功能。
字符串处理
还支持大多数字符串处理函数。其中一些仅适用于 ABAP SQL,主要与正则表达式相关。可在 ABAP 关键字文档中找到详细列表。
日期和时间处理
数据和时间处理功能领域存在的最大限制。在此,通用函数(IS_VALID()、ADD_DAYS( )、DAYS_BETWEEN() 等)仅在 ABAP SQL 中可用。在 ABAP CDS 中,必须使用类型特定的变式,即以 DATS、DATN、TIMS、TSTMP 等开头的相应函数。
此外,ABAP CDS 中不支持从日期或时间字段中提取信息的函数,这意味着无法在 ABAP CDS 中使用函数 WEEKDAY( )、EXTRACT_MONTH() 等。有关完整列表,请参阅 ABAP 关键字文档。
我们来看一些示例。
ABAP CDS 中的转换函数
示例:ABAP SQL 和 ABAP CDS 中的货币转换
播放视频以查看 ABAP SQL 和 ABAP CDS 中的货币转换示例。
视频:本节含 SAP 官方视频(视频 ID
1_zl2khmov),需在 learning.sap.com 在线观看。

某些转换函数在 ABAP SQL 中具有命名参数,但在 ABAP CDS 中没有参数名称。因此,ABAP SQL 中的可选参数在 ABAP CDS 中变为必需。
让我们以时戳转换函数 TSTMP_TO_DATS() 为例。函数有四个参数,其中两个是强制参数,两个是 ABAP SQL 中的可选参数。在 ABAP CDS 中,所有四个参数均为必需参数,并在没有显式参数分配的情况下传递。
会话变量

在 ABAP CDS 视图实体中,您可以使用会话变量访问 ABAP 系统字段的值。对会话变量的访问以前缀 $session. 开头,后跟变量名称。
该示例在过滤器表达式中使用会话变量 system_language,在 WHERE 子句中使用会话变量 system_date。但您也可以使用会话变量,我几乎可以使用任何其他操作数位置。
警告
仅当读取请求来自 ABAP 系统时,会话变量才包含值。在任何其他情况下,会话变量的值均未定义!这就是您应该选择输入参数来访问 ABAP 系统字段的原因。有关详细信息,请参阅下一课。
目前,ABAP CDS 提供六个内置会话变量。该清单将其与相关系统字段一起显示。

注意
除内置会话变量外,还有应用程序会话变量。它们是特定应用程序所必需的,并由专用系统程序设置。有关详细信息,请参阅 ABAP 关键字文档。
在 CDS 视图中使用内置函数
您想要使用 SQL 逻辑扩展 CDS 视图实体。使用 SQL 函数连接部门助理的名和姓,将月工资转换为唯一货币并计算所属公司,即员工为公司工作的天数。
模板:
/LRN/C_EMPLOYEE_EXP(数据定义)
解决方案:
/LRN/C_EMPLOYEE_FCT(数据定义)
前提条件
在本练习中,您需要上一练习中使用的 CDS 视图实体(建议名称为 Z##_C_EmployeeQuery,其中 ## 是您的组编号)。如果尚未完成上一练习,请创建数据定义 /LRN/C_EMPLOYEE_EXP 的副本。
任务 1: 使用字符串函数
在评估员工数据的 CDS 视图实体(建议名称为 Z##_C_EmployeeQuery,## 是您的组编号)中,调整 AssistantName 视图元素的定义。使用合适的字符串函数连接部门助理的名和姓,用单个空格分隔。
步骤
编辑视图实体的元素列表。注释派生部门助理姓氏的视图元素。
将光标置于相应代码行中的任意位置,然后按
Ctrl + <在行的开头添加注释符号 (//)。在旧视图元素之后,使用代码完整化将 SQL 函数
CONCATENATE_WITH_SPACE的调用添加为新的视图元素。在代码行
// _Department._Assistant.LastName as AssistantName,中,将光标放在冒号之后,然后按Enter插入新行。输入
con并按 **Ctrl + 空格**键以调用代码完成。从建议列表中选择 concat_with_space(arg1, arg,2, space_cnt) (function) ,然后按
Shift + Enter插入完整签名。
结果
应插入以下代码:
concat_with_space( arg1, arg2, space_cnt )
将占位符替换为合适的视图元素和文字。
如下调整代码:
concat_with_space( _Department._Assistant.FirstName,
_Department._Assistant.LastName,
1 )
注意
我们插入了附加换行符,以提高打印课程材料的可读性。
提供用于已移除视图元素的相同视图元素名称(建议名称为:
AssistantName)。如下调整代码:
concat_with_space( _Department._Assistant.FirstName,
_Department._Assistant.LastName,
1 ) as AssistantName,
激活并测试 CDS 视图实体。
按
Ctrl + F3激活开发对象。按
F8在数据预览工具中测试 CDS 视图实体。
任务 2: 使用日期函数
在新视图元素(建议名称:CompanyDependationation)中,使用合适的日期函数来计算员工的公司从属关系(以天为单位),即输入日期和今天之间的天数。然后将结果除以每年的天数,以计算员工的公司从属关系(以年为单位),精度为 1 位小数。
提示
当前日期在会话变量
$session.user_date和$session.system_date中可用。对于此练习,使用当前系统日期。为简单起见,无视闰年的存在,假定 一 年有 365 天。
步骤
编辑视图实体的元素列表。在公开关联之前,使用代码完整化添加 SQL 函数
DATS_DAYS_BETWEEN的调用作为新视图元素。将光标置于代码行的开头
/* Associations */并按Enter插入新行。在新代码行中,**
输入数据**并按 **Ctrl + 空格**键调用代码完整化。从建议列表中选择 dats_days_between( date1, date2) (function) 并按
Shift + Enter插入完整签名。
结果
应插入以下代码:
dats_days_between( date1, date2 )
将占位符替换为合适的视图元素和会话变量,并指定视图元素名称(建议名称:
CompanyDependation)。如下调整代码:
dats_days_between( EntryDate,
$session.system_date ) as CompanyAffiliation,
注意
同样,我们插入了额外的换行符,以提高打印课程材料的可读性。
使用 SQL 函数
division以年为单位计算公司的从属关系,精度为一位小数。如下调整代码:
division( dats_days_between( EntryDate,
$session.system_date ),
365,
1 ) as CompanyAffiliation,
激活并测试 CDS 视图实体。
按
Ctrl + F3激活开发对象。按
F8在数据预览工具中测试 CDS 视图实体。
任务 3: 执行货币转换
在新视图元素(建议名称:AnnualSalaryConverted)中,使用合适的 SQL 函数将视图元素 AnnualSalary 的内容转换为货币美元。使用当前系统日期作为汇率日期。然后调整视图元素 MonthlySalary 的计算。使用转换的年薪作为输入,而不是未转换的年薪。
提示
可以通过使用$projection 前缀重用同一视图实体的计算视图元素。
步骤
移除或注释视图元素
CurrencyCode。将光标置于代码行
CurrencyCode,并按Ctrl + <在行开头添加注释符号 (//)。在下一代码行中,定义新视图元素(建议名称:
CurrencyCodeUSD),在其中将文字'USD'转换为预定义类型abap.cuky。如下调整代码:
// CurrencyCode,
cast( 'USD' as /dmo/currency_code ) as CurrencyCodeUSD,
在
MonthlySalary视图元素之前,使用代码完整化插入 SQL 函数currency_conversion的调用。在新代码行中,输入
curr并按 **Ctrl + 空格**键调用代码完整化。从建议清单中,选择以 currency_conversion( amount => amount, ... 开头的条目并按
Shift + Enter插入完整签名。代码现在应如下所示:
currency_conversion( amount => amount,
source_currency => source_currency ,
target_currency => target_currency,
exchange_rate_date => exchange_rate_date
)
@EndUserText.label: 'Monthly Salary'
@Semantics.amount.currencyCode: 'CurrencyCode'
cast( AnnualSalary as abap.fltp ) / 12.0 as MonthlySalary,
注意
我们再次插入了附加换行符。
将占位符替换为参数值。使用源视图中的年薪和货币代码、自己的视图元素
CurrencyCodeUSD和系统变量system_date作为输入。如下调整代码:
currency_conversion( amount => AnnualSalary,
source_currency => CurrencyCode ,
target_currency => $projection.CurrencyCodeUSD,
exchange_rate_date => $session.system_date
)
添加元素名称(建议名称:
AnnualSalaryConverted)、标签和必需的 Semantics.amount.CurrencyCode 注释。如下调整代码:
@EndUserText.label: 'Annual Salary'
@Semantics.amount.currencyCode: 'CurrencyCodeUSD'
currency_conversion( amount => AnnualSalary,
source_currency => CurrencyCode ,
target_currency => $projection.CurrencyCodeUSD,
exchange_rate_date => $session.system_date
) as AnnualSalaryConverted,
调整视图元素
MonthlySalary的计算。使用新视图元素 Annual**SalaryConverted** 代替AnnualSalary作为输入。如下调整代码:
@EndUserText.label: 'Monthly Salary'
@Semantics.amount.currencyCode: 'CurrencyCode'
cast( $projection.AnnualSalaryConverted as abap.fltp )
/ 12.0 as MonthlySalary,
调整视图元素名称(建议名称:
MonthlySalaryConverted)并调整必需的 Semantics.amount.CurrencyCode 注释。如下调整代码:
@EndUserText.label: 'Monthly Salary'
@Semantics.amount.currencyCode: 'CurrencyCodeUSD'
cast( $projection.AnnualSalaryConverted as abap.fltp )
/ 12.0 as MonthlySalaryConverted,
激活并测试 CDS 视图实体。
按
Ctrl + F3激活开发对象。按
F8在数据预览工具中测试 CDS 视图实体。