ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters

CASE

在 SELECT 语句中使用 CASE 作为条件语句,与一般条件判断使用的 CASE 类似,但有所区别

 该语句不仅可以用于单值判断,也可以根据复杂条件进行判断;
此外,WHEN OTHERS 不再适用,需要使用 ELSE 代替,语句结束时使用 END,而不是 ENDCASE,且需要定义别名

SELECT CASE currcode
       WHEN 'EUR' THEN carrname
       ELSE url
       END AS case_simple,

       CASE
       WHEN currcode = 'EUR' THEN url
       WHEN carrname <> ' '  THEN carrname
       ELSE carrid && '@' && currcode
       END AS case_complex
  FROM scarr
  INTO TABLE @DATA(lt_data)
    UP TO 5 ROWS. 

ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters_第1张图片

NULL Value

使用条件语句判断并处理 NULL 值

 在使用 LEFT / RIGHT OUTER JOIN 关联外表时,如果主表中存在记录,但在外表中没有关联到数据,则外表的这部分字段的值在取数过程中始终为 NULL,在取数完成后传入数据对象时,NULL 会再转换成系统兼容的值,通常为初始值;
NULL 值用于数值计算或是字符串处理时返回结果仍为NULL值,可以在条件语句中用 IS [ NOT ] NULL 判断以及处理
现在表缓存支持真null值了,null值不再被转换为类型初始值;
is initial,类型初始值;

DATA: lr_carrid TYPE RANGE OF s_carr_id.

lr_carrid = VALUE #( sign = 'I' option = 'EQ' ( low = 'AA' )
                                              ( low = 'CO' ) ).
SELECT DISTINCT
       r~carrid,
       CASE
       WHEN t~seatsocc IS NULL THEN 'IS NULL'
       WHEN t~seatsocc IS NOT NULL THEN 'IS NOT NULL'
       END AS field_status
  FROM scarr AS r
  LEFT OUTER JOIN sflight AS t ON t~carrid = r~carrid
  INTO TABLE @DATA(lt_data)
 WHERE r~carrid IN @lr_carrid. 

在这里插入图片描述

 使用内嵌表达式 COALESCE( arg1, arg2, arg3 … argn )处理NULL值
该表达式用来返回第一个非 NULL 字段,参数至少有2个,至多255个,如果参数都为 NULL,则返回 NULL

DATA: lr_carrid TYPE RANGE OF s_carr_id.

lr_carrid = VALUE #( sign = 'I' option = 'EQ' ( low = 'AA' )
                                              ( low = 'CO' ) ).
SELECT r~carrid,
       SUM( 1 ) AS total_lines,
       SUM( t~seatsocc ) AS actual_occ,
       SUM( t~seatsocc + 1 ) AS total_occ,
       SUM( coalesce( t~seatsocc + 1 , 1 ) ) AS correct_occ 
  FROM scarr AS r
  LEFT OUTER JOIN sflight AS t ON t~carrid = r~carrid
  INTO TABLE @DATA(lt_data)
 WHERE r~carrid IN @lr_carrid
 GROUP BY r~carrid. 

在这里插入图片描述

CAST

在查询语句中使用 CAST 实现字段的类型转换

 以获取指定日期的汇率为例,汇率表中存储的日期不能直接使用,例如日期20180831 对应存储的数据为 79819168,所以我们在使用时需要转换类型
在程序中,我们可以调用 FM 来获取汇率,这里只用来测试 CAST 的使用,在CDS View中可能会被使用

DATA(lv_date) = CONV datum( '20180830' ).

SELECT MIN( CAST( CAST( @lv_date AS NUMC ) AS INT4 ) -
            ( 99999999 - CAST( CAST( gdatu AS NUMC ) AS INT4 ) ) ) AS time_differ,
       ukurs AS exchange_rate
  FROM tcurr
  INTO TABLE @DATA(lt_data)
 WHERE kurst = 'M'
   AND fcurr = 'CNY'
   AND tcurr = 'EUR'
 GROUP BY gdatu, ukurs
HAVING MIN( CAST( CAST( @lv_date AS NUMC ) AS INT4 ) -
            ( 99999999 - CAST( CAST( gdatu AS NUMC ) AS INT4 ) ) ) >= 0
 ORDER BY time_differ DESCENDING. 

DATA(lv_exchange_rate) = VALUE #( lt_rate[ 1 ]-exchange_rate OPTIONAL ).

ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters_第2张图片

 转换规则( ABAP 7.53 )如下图:
X:没有特殊限制
Y:初始长度不能小于目标长度
Z:目标长度必须足够显示源数据类型的值
C:初始长度必须等于目标长度

ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters_第3张图片
CDS生成OData,查询的内容包含日期,如果不用CAST转换,当日期为空时,就会报错,所以需要使用CAST转换,如下:
ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters_第4张图片
查询出来的结果:
ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters_第5张图片
上面的第一种有可能会报错,为空就会报错。

CDS with Parameters

现支持 SELECT 传入 Parameter 从 CDS View 中获取数据

 在查询语句中,参数必须紧接在对应的数据源后边,作为一个整体来使用,否则不能通过语法检查 测试用CDS
View如下图所示,该视图需要传入两个参数 ip_matnr 以及 ip_langu

ABAP--新语法--Open SQL--第三天-- CASE / NULL Value / CAST / CDS with Parameters_第6张图片

SELECT *
  FROM zcds_demo( ip_matnr = 'DHA_DEMO_1',
                  ip_langu = @sy-langu ) AS a 
  INTO TABLE @DATA(lt_data). 

在这里插入图片描述

你可能感兴趣的:(ABAP新语法,SAP,ABAP)