当前位置:Gxlcms > 数据库问题 > ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

时间:2021-07-01 10:21:17 帮助过:17人阅读

宿主表达式abap_expression可以是任何ABAP表达式,可以是一个构造器表达式、表表达式、算术表达式、字符串表达式、bit表达式、内建函数、函数性的方法、或者是方法,它通过括号()包围起来,并且要加上前缀@。Open SQL中的宿主表达式从左到右计算,并且它们的结果会作为宿主变量传递给数据库。事实上,你可以将宿主表达式视为通过ABAP表达式为ABAP帮助变量赋值的简写。以下例子演示了一个表表达式,表达式从内表carriers中读取值,并放置在where条件右端:

SELECT carrid, connid, cityfrom, cityto
       FROM spfli
       WHERE carrid =
         @( VALUE spfli-carrid( carriers[ KEY name
                                          carrname = name ]-carrid
                                          OPTIONAL ) )
       INTO TABLE @DATA(result)

我个人喜欢下面的语句:

DATA(rnd) = cl_abap_random_int=>create(
               seed = CONV i( sy-uzeit ) min = 1 max = 100 ).

INSERT demo_expressions FROM TABLE @(
   VALUE #(
    FOR i = 0 UNTIL i > 9
      ( id = i
        num1 = rnd->get_next( )
        num2 = rnd->get_next( ) ) ) ).

这段代码构造了一个填充了随机数字的内表,接着在INSERT语句中用到了它。这是ABAP文档里面的一个很酷的demo程序。

更多信息,请查看宿主表达式

SQL表达式

在ABAP 7.50 中,SQL表达式的使用得到了扩展:

  •  除了在SELECT列表中使用它们,你现在可以在WHERE, HAVING, ON和CASE的左手端作为CAST的操作数使用它们。注意,这会把包含的宿主变量和宿主表达式作为SQL表达式的操作数处理。
  • 以下SQL函数现可用于SQL表达式:ROUND, CONCAT, LPAD, LENGTH, REPLACE, RIGHT, RTRIM, SUBSTRING。而COALESCE函数的参数上限现在达到了255个。

一个WHERE左手端的算术表达式示例:

SELECT carrid, connid, fldate, seatsmax, seatsocc,

       seatsmax – seatsocc AS seatsfree

       FROM sflight

       WHERE seatsmax – seatsocc > @( meth( ) )

       INTO TABLE @DATA(result).

通过字符串函数使用CONCAT将列拼接的例子:

SELECT CONCAT( CONCAT( carrid,

                       LPAD( carrname,21,’ ‘ ) ),

               LPAD( url,40,’ ‘ ) ) AS line

       FROM scarr

       INTO TABLE @DATA(result). 

通过运算符&&拼接字符串已经不可用。

更多信息请看SQL表达式。

路径表达式

路径表达式是一种你已经从CDS中了解过的概念。如果一个CDS视图暴露出关联相同的或者不同的视图可以通过路径表达式访问它。

例如,下面的CDS视图在它的SELECT列表里面用到了路径表达式:

@AbapCatalog.sqlViewName: ‘DEMO_CDS_USE_ASC’

@AccessControl.authorizationCheck: #NOT_REQUIRED

define view demo_cds_use_assocs

  with parameters p_carrid:s_carrid

  as select from demo_cds_assoc_scarr as scarr

{ scarr.carrname,

  scarr._spfli.connid,

  scarr._spfli._sflight.fldate,

  scarr._spfli._sairport.name }

where scarr.carrid = :p_carrid 

关联的名字以underscore_为前缀,并且通过如下的视图定义:

@AbapCatalog.sqlViewName: ‘DEMO_CDS_ASC_CAR’

@AccessControl.authorizationCheck: #NOT_REQUIRED

define view demo_cds_assoc_scarr

  as select from scarr

            association to demo_cds_assoc_spfli as _spfli

              on scarr.carrid = _spfli.carrid

     { _spfli,

       carrid,

       carrname }

@AbapCatalog.sqlViewName: ‘DEMO_CDS_ASC_SPF’

@AccessControl.authorizationCheck: #NOT_REQUIRED

define view demo_cds_assoc_spfli

  as select from spfli

            association to sflight as _sflight

              on spfli.carrid = _sflight.carrid and

                 spfli.connid = _sflight.connid

             association [1..1] to sairport as _sairport

              on spfli.airpfrom = _sairport.id

     { _sflight,
      _sairport,

       carrid,

       connid,

       airpfrom } 

在ABAP 7.50中,访问CDS视图时,Open SQL的SELECT语句也可以在它的SELECT清单或者FROM子句中使用这样的路径表达式。下面的SQL语句实现了和上面的CDS视图一样的功能:

SELECT scarr~carrname,

       \_spfli-connid AS connid,

       \_spfli\_sflight-fldate AS fldate,

       \_spfli\_sairport-name AS name

       FROM demo_cds_assoc_scarr AS scarr

       WHERE scarr~carrid = @carrid

       ORDER BY carrname, connid, fldate

       INTO TABLE @DATA(result).

看起来区别不算大,是吧?唯一的就是点被反斜杠 \ 代替了(因此,路径表达式看起来像那些meshes)。当编译这些Open SQL的时候,路径表达式将被转换为数据库中的join。可以在ST05中观察这点。

更多信息请查看路径表达式。

其它新闻

这不是有关ABAP 7.50中的Open SQL的全部信息。下篇文章我将会展示SELECT语句得到的增强,这使得INTO可以放置在SELECT后的末尾...

 

ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

标签:optional   适应   lda   eth   lib   class   带来   UI   res   

人气教程排行