点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
在这篇文章中,您将了解 CDS 视图中的各种表达式和操作。
到目前为止,我们已经了解了如何创建一个简单的 CDS 视图、带有关联、参数等的 CDS 视图。
这篇文章将更多地关注语法部分而不是概念,因为这里的概念要么不言自明,要么在之前的文章中都有介绍。
Projection List
Fields of data source
字段可以是关键字段或非关键字段。可以使用别名。如果未使用别名,则字段名称本身将成为最终的列名称。
Literals
这些是数字或字符类型的常量,只需将所有行的常量值放在输出中。例如。“12345”、“CDS”。必须为字段列表中的文字指定别名。
Session Variables
下面的会话变量可以与$session.variable_name一起使用
Variable | Usage |
用户 | 当前用户名:SY-UNAME |
客户 | 当前客户:SY-MANDT |
系统语言 | 当前语言:SY-LANGU |
系统日期 | 当前系统日期:SY-DATUM(从 7.51 开始可用) |
Case Statement and Conditions
Simple case – 类似于 ABAP 的单个变量的 Case 语句。
复杂/搜索案例-这在每种情况下都有多个条件,并且可以具有除“等于”( = )以外的条件。
在这个例子中考虑下面的 Marvels Movie 表。
假设我们想将 Phase 生成为 First、Second、Third、Four 而不是 Phase 1、Phase 2 等等,我们可以使用 Simple Case 语句。
同样,如果我们想根据开场集合调用电影 Hit、Flop 等,我们可以使用 Complex Case 语句。
投影列表
可以使用$projection访问投影列表中的字段。您可以在Associations 中使用它。
参数
在带有参数的CDS 视图中,可以使用冒号 (:) 或 $parameters来寻址 参数。
Conditions
Regular Comparisons
operand1 = operand2 operand1 <> operand2 operand1 < operand2 operand1 > operand2 operand1 <= operand2 operand1 >= operand2
这些真的很简单吧?We also have between.
operand1 between operand2 and operand3
Pattern comparisons
这类似于我们在 Open SQL 中执行的包含字符串或类似操作。
如果数据本身有要搜索的 % 或 _ 怎么办?
然后我们可以使用转义字符。假设电影名称是 “Avenger%1” ,我们想用模式Avenger%进行搜索 , 那么我们可以在模式字符串中使用转义字符。SAP 建议使用# 作为转义字符。
when movie like 'Avenger#%%' escape '#'
Check for null values
operand1 is nulloperand2 is not null
算术运算
我们可以有加法、减法、乘法、除法,除此之外还有一个否定运算符。
case indicator when 'Credit' then amount when 'Debit' then -amount end as DueAmount
聚合函数
聚合函数评估来自源的多个记录并返回聚合,例如总数、计数。
MAX、MIN、AVG、SUM、COUNT 是可用的聚合函数。这些都是不言自明的,所以我只举一个例子。
使用聚合函数时,Group By子句是强制性的。可以添加Have子句以基于聚合过滤数据。
类型转换
我们已经在货币和单位转换帖子中看到了这一点。
cast ( 'EUR' as abap.cuky ) as Currency
以下是可以使用的类型。
数据类型 | 描述 |
abap.char( len ) | 具有长度规格的字符 |
abap.clnt[(3)] | 客户端 |
abap.cuky( len ) | 货币密钥 |
abap.curr(len,decimals) | CURR 长度为 len 和小数点小数位 |
abap.dats[(8)] | 日期 |
abap.dec(len,decimals) | DEC 长度为 len 和小数点小数位 |
abap.fltp[(16,16)] | 浮点 |
abap.int1[(3)] | INT1 |
abap.int2[(5)] | INT2 |
abap.int4[(10)] | INT4 |
abap.int8[(19)] | INT8 |
abap.lang[(1)] | 语言 |
abap.numc( len ) | 长度为 len 的 NUMC |
abap.quan(len,decimals) | QUAN 长度为 len,带小数点小数位 |
abap.raw(len) | RAW |
abap.sstring(len) | 字符串 |
abap.tims[(6)] | 时间 |
abap.unit( len ) | 单元 |
数值函数
下面的数字函数是可能的。
功能 | 输出 |
ABS(arg) | 绝对数量 |
CEIL(arg) | Round Up |
ROUND(arg, pos) | 用小数规范的数量四舍五入 |
FLOOR(arg) | 四舍五入 |
DIV(arg1, arg2) | 商 |
DIVISION(arg1, arg2, dec) | 结果四舍五入到十进制小数位。 |
MOD(arg1, arg2) | 余 |
字符串函数
诸如连接、子串、替换、长度、左子串、右子串移除右边或左边空白或零等操作是可能的。
concat( char1, char2 ) as concat, length( char1 ) as length, left( char1, 3 ) as left, lower( char2 ) as lower, upper( char2 ) as upper, right( char1, 3 ) as right, substring( char1, 3, 3 ) as substring, replace( char1, ',' , '.' ) as replace, concat_with_space( char1, char2, 1 ) as concat_with_space
十进制移位
这可用于根据货币获取金额,特别是小数点后 2 位以外的货币。
decimal_shift( amount => amount, currency => currency ) as Amount
日期函数
可以在 CDS 中使用添加天数、添加月数、日期之间的天数和日期验证等功能。
dats_add_days (releasedon, 14, 'INITIAL') as DateAfter2Weeks, dats_add_months (releasedon, 3, 'NULL' ) as Dateafter3Months, dats_days_between (releasedon, :iv_curr_date ) as DaysSinceTheRelease, (validDate_donis) Isvalid
嵌套函数
也可以在如下函数中使用函数,将时间从分钟转换为 HH:MM 格式。
concat( concat(lpad ( ltrim ( cast( div(fltime, 60) as abap.char( 12 ) ), '0' ), 2, '0' ), ':' ) , lpad ( ltrim ( cast( mod(fltime, 60) as abap.char( 12 ) ), '0'), 2, '0' ) ) as Flight_Time
这可能是一个更复杂的例子
将时间除以 60 得到小时数
将结果转换为字符
删除前导零(如果有)
添加最多 2 个位置的前导零(以便 1 显示为 01)
重复这个过程几分钟,只是这次使用 mod 来获得剩余的分钟数
然后将 HH 和 : 连接成说 HH: 然后将它与 MM 连接以获得 HH:MM
这里的重点不是立即理解所有这些,而是要知道这种复杂的表达是可能的。