探索 HANA 上的 ABAP [7]:CDS View 中的表达式和操作

2021-11-07 23:06发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

在这篇文章中,您将了解 CDS 视图中的各种表达式和操作。

到目前为止,我们已经了解了如何创建一个简单的 CDS 视图、带有关联、参数等的 CDS 视图。

这篇文章将更多地关注语法部分而不是概念,因为这里的概念要么不言自明,要么在之前的文章中都有介绍。


Projection List

Fields of data source

字段可以是关键字段或非关键字段。可以使用别名。如果未使用别名,则字段名称本身将成为最终的列名称。






Literals

这些是数字或字符类型的常量,只需将所有行的常量值放在输出中。例如。“12345”、“CDS”。必须为字段列表中的文字指定别名。




Session Variables

下面的会话变量可以与$session.variable_name一起使用 


VariableUsage
用户当前用户名: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

这里的重点不是立即理解所有这些,而是要知道这种复杂的表达是可能的。


赞赏支持