在 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 视图元素的定义。使用合适的字符串函数连接部门助理的名和姓,用单个空格分隔。

步骤

  1. 编辑视图实体的元素列表。注释派生部门助理姓氏的视图元素。

  2. 将光标置于相应代码行中的任意位置,然后按 Ctrl + < 在行的开头添加注释符号 (//)。

  3. 在旧视图元素之后,使用代码完整化将 SQL 函数 CONCATENATE_WITH_SPACE 的调用添加为新的视图元素。

  4. 在代码行 // _Department._Assistant.LastName as AssistantName, 中,将光标放在冒号之后,然后按 Enter 插入新行。

  5. 输入 con 并按 **Ctrl + 空格**键以调用代码完成。

  6. 从建议列表中选择 concat_with_space(arg1, arg,2, space_cnt) (function) ,然后按 Shift + Enter 插入完整签名。

结果

应插入以下代码:

concat_with_space( arg1, arg2, space_cnt )
  1. 将占位符替换为合适的视图元素和文字。

  2. 如下调整代码:

concat_with_space( _Department._Assistant.FirstName,
_Department._Assistant.LastName,
1 )

注意

我们插入了附加换行符,以提高打印课程材料的可读性。

  1. 提供用于已移除视图元素的相同视图元素名称(建议名称为:AssistantName)。

  2. 如下调整代码:

concat_with_space( _Department._Assistant.FirstName,
_Department._Assistant.LastName,
1 ) as AssistantName,
  1. 激活并测试 CDS 视图实体。

  2. Ctrl + F3 激活开发对象。

  3. F8 在数据预览工具中测试 CDS 视图实体。

任务 2: 使用日期函数

在新视图元素(建议名称:CompanyDependationation)中,使用合适的日期函数来计算员工的公司从属关系(以天为单位),即输入日期和今天之间的天数。然后将结果除以每年的天数,以计算员工的公司从属关系(以年为单位),精度为 1 位小数。

提示

当前日期在会话变量 $session.user_date$session.system_date 中可用。对于此练习,使用当前系统日期。

为简单起见,无视闰年的存在,假定 一 年有 365 天。

步骤

  1. 编辑视图实体的元素列表。在公开关联之前,使用代码完整化添加 SQL 函数 DATS_DAYS_BETWEEN 的调用作为新视图元素。

  2. 将光标置于代码行的开头 /* Associations */ 并按 Enter 插入新行。

  3. 在新代码行中,**输入数据**并按 **Ctrl + 空格**键调用代码完整化。

  4. 从建议列表中选择 dats_days_between( date1, date2) (function) 并按 Shift + Enter 插入完整签名。

结果

应插入以下代码:

dats_days_between( date1, date2 )
  1. 将占位符替换为合适的视图元素和会话变量,并指定视图元素名称(建议名称:CompanyDependation)。

  2. 如下调整代码:

dats_days_between( EntryDate,
$session.system_date ) as CompanyAffiliation,

注意

同样,我们插入了额外的换行符,以提高打印课程材料的可读性。

  1. 使用 SQL 函数 division 以年为单位计算公司的从属关系,精度为一位小数。

  2. 如下调整代码:

division( dats_days_between( EntryDate,
$session.system_date ),
365,
1 ) as CompanyAffiliation,
  1. 激活并测试 CDS 视图实体。

  2. Ctrl + F3 激活开发对象。

  3. F8 在数据预览工具中测试 CDS 视图实体。

任务 3: 执行货币转换

在新视图元素(建议名称:AnnualSalaryConverted)中,使用合适的 SQL 函数将视图元素 AnnualSalary 的内容转换为货币美元。使用当前系统日期作为汇率日期。然后调整视图元素 MonthlySalary 的计算。使用转换的年薪作为输入,而不是未转换的年薪。

提示

可以通过使用$projection 前缀重用同一视图实体的计算视图元素。

步骤

  1. 移除或注释视图元素 CurrencyCode

  2. 将光标置于代码行 CurrencyCode, 并按 Ctrl + < 在行开头添加注释符号 (//)。

  3. 在下一代码行中,定义新视图元素(建议名称:CurrencyCodeUSD),在其中将文字 'USD' 转换为预定义类型 abap.cuky

  4. 如下调整代码:

// CurrencyCode,
cast( 'USD' as /dmo/currency_code ) as CurrencyCodeUSD,
  1. MonthlySalary 视图元素之前,使用代码完整化插入 SQL 函数 currency_conversion 的调用。

  2. 在新代码行中,输入 curr 并按 **Ctrl + 空格**键调用代码完整化。

  3. 从建议清单中,选择以 currency_conversion( amount => amount, ... 开头的条目并按 Shift + Enter 插入完整签名。

  4. 代码现在应如下所示:

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,

注意

我们再次插入了附加换行符。

  1. 将占位符替换为参数值。使用源视图中的年薪和货币代码、自己的视图元素 CurrencyCodeUSD 和系统变量 system_date 作为输入。

  2. 如下调整代码:

currency_conversion( amount             => AnnualSalary,
source_currency    => CurrencyCode ,
target_currency    => $projection.CurrencyCodeUSD,
exchange_rate_date => $session.system_date
)
  1. 添加元素名称(建议名称:AnnualSalaryConverted)、标签和必需的 Semantics.amount.CurrencyCode 注释。

  2. 如下调整代码:

@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,
  1. 调整视图元素 MonthlySalary 的计算。使用新视图元素 Annual**SalaryConverted** 代替 AnnualSalary 作为输入。

  2. 如下调整代码:

@EndUserText.label: 'Monthly Salary'
@Semantics.amount.currencyCode: 'CurrencyCode'
cast( $projection.AnnualSalaryConverted as abap.fltp )
/ 12.0 as MonthlySalary,
  1. 调整视图元素名称(建议名称:MonthlySalaryConverted)并调整必需的 Semantics.amount.CurrencyCode 注释。

  2. 如下调整代码:

@EndUserText.label: 'Monthly Salary'
@Semantics.amount.currencyCode: 'CurrencyCodeUSD'
cast( $projection.AnnualSalaryConverted as abap.fltp )
/ 12.0 as MonthlySalaryConverted,
  1. 激活并测试 CDS 视图实体。

  2. Ctrl + F3 激活开发对象。

  3. F8 在数据预览工具中测试 CDS 视图实体。