5.带输入参数的CDS VIEW

目录

一、参数规则

二、参数的使用方法及位置

三、参数值

四、带参数的CDS VIEW使用

五、参数的默认值


一、参数规则

1.参数必须有类型;

2.参数名至少两字符;

3.类型可以是数据元素(如:BUKRS),预定义类型(如:abap.char(10));

4.类型不能为数据结构,表类型

5.可以使用注解给参数增加信息,可以加到参数前面或者后面

二、参数的使用方法及位置

1.方法:

-        $parameters.参数的名字

-        ":"参数的名字

推荐使用第一种方式,因为可以代码补全,少敲代码

2.使用地方

-        作为字段使用

-        作为where条件使用

-        作为case语句的判断条件

-        作为公式的输入值

-        作为路径表达式的过滤条件

三、参数值

允许的参数值:

-        常量(字符、数字)

-        其他CDS VIEW的参数

-        session变量

session变量目前有六个,如下:

$session.client(客户端);

$session.system_date(系统日期);

$session.system_language(系统语言);

$session.user(登录用户);

$session.user_date(用户使用时间);

$session.user_timezone(用户所在时区)

例子:

@AbapCatalog.sqlViewName: 'ZVDEM_CDS_01' //SE11 中查询的视图名
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'CDS VIEW DEMO'
define view ZDEMO_CDS_01  // ABAP 程序里使用的名字
with parameters
    @EndUserText.label: '航线代码'
    p_carrid : abap.char( 3 ), //sap预定义类型
    @EndUserText.label: '航班链接编号'  /*设置字段描述,放在字段前一行*/
    p_connid : s_conn_id, //数据元素  
    p_fldate : abap.dats
    @<EndUserText.label: '航班日期', /*设置字段描述,放在字段后一行*/
    @EndUserText.quickInfo: '标识'
    p_occupid : abap.char( 1 )
as select from sflight as a
association [0..1] to spfli as _flighttime
on $projection.Carrid = _flighttime.carrid
and $projection.Connid = _flighttime.connid
{       
  @EndUserText.label: '航线代码'
  key  a.carrid    as Carrid,
  @EndUserText.label: '航班链接编号'
  key  a.connid    as Connid,
  @EndUserText.label: '航班日期'
  key  a.fldate    as Fldate,
       @EndUserText.label: '航空运费'
       @Semantics.amount.currencyCode: 'Currency'
       @DefaultAggregation: #MIN
       a.price     as Price,
       @EndUserText.label: '航班本地货币'
       @Semantics.currencyCode: true
       a.currency  as Currency,
       @EndUserText.label: '飞机类型'
       a.planetype as Planetype,
       @EndUserText.label: '经济舱最大容量'
       @DefaultAggregation: #SUM
       a.seatsmax  as Seatsmax,
       @EndUserText.label: '售出的经济舱座位'
       @DefaultAggregation: #SUM
       a.seatsocc  as Seatsocc,
       //作为字段使用
       $parameters.p_carrid     as u_carrid, 
       $session.client          as session_client,
       $session.system_date     as system_date,
       $session.system_language as language,
       $session.user            as u_user,
       $session.user_date       as user_date,
       $session.user_timezone   as user_timezone,
       //作为case的判断条件
       case $parameters.p_occupid
            when 'X' then a.seatsocc
            else a.seatsmax - a.seatsocc
       end as seat,  
       //作为公式的输入值
       dats_days_between( cast( $parameters.p_fldate as abap.dats ),cast( $session.system_date as abap.dats ) ) as dayto, 
       //作为路径表达式的筛选条件
       _flighttime[carrid = $parameters.p_carrid].airpfrom as airpfr
} where a.carrid = :p_carrid  //作为WHERE条件使用
  and   a.connid = :p_connid
  and   a.fldate > :p_fldate

eclipse中执行带有参数的CDS VIEW需要输入设置参数的值,如下图:

注意:只会对输入值的类型进行检查,不会检查域里的有效范围

运行结果:

四、带参数的CDS VIEW使用

1.使用在另外一个CDS VIEW

例子:

define view ZDEMO_CDS_02 
with parameters
    p_date : abap.dats
as select from ZDEMO_CDS_01 ( 
                              p_carrid:'AA',
                              p_connid:'0017',
                              p_fldate:$parameters.p_date,
                              p_occupid:'X'
                               )
{
    *
}

注意:在CDS里读取其他有参数的CDS所有参数必须给值

2.ABAP 程序里使用带参数的CDS VIEW

-        参数用括号括起来

-        参数的顺序可以不一致

-        可以使用常量

-        可以使用程序里自定义的变量,变量前面要加@

例子:

*&---------------------------------------------------------------------*
*& Report ZTEST_YY_10
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_yy_10.


DATA(lv_pa) = 'A'.
DATA(lv_date) = '20240101'.

SELECT FROM zdemo_cds_01(
  p_carrid = @( 'A' && lv_pa ),
  p_connid = '0017',
  p_fldate = @lv_date,
  p_occupid = 'X' )
  FIELDS * INTO TABLE @DATA(gt_a).

cl_demo_output=>display( gt_a ).

运行结果:

 注意:只有HANA DB在7.50以上的才支持有参数的CDS VIEW

五、参数的默认值

作用:当调用时没有给实际的参数值的时候,系统自动设置成默认参数值

1.利用注释:@Environment.systemField给参数加默认值,用的最多的如下:

-        #CLIENT 客户端;

-        #SYSTEM_DATE 系统日期;

-        #SYSTEM_TIME 系统时间;

-        #SYSTEM_LANGUAGE 系统语言;

-        #USER 登录用户。

2.默认值只有在ABAP SQL里有作用,当cds调用另一个cds的时候是不起任何作用的,会被忽略掉

3.当使用#client了,就不能明确给参数实际的值

例子:

CDS代码

define view ZDEMO_CDS_02 
with parameters
        @Environment.systemField: #SYSTEM_DATE
        p1 :syst_datum,
        @Environment.systemField: #SYSTEM_LANGUAGE
        p2 :syst_langu
    as select from sflight
{
    *
}
where
    fldate = :p1

1.eclipse运行时因为设定了默认值,因此不需要输入参数就能执行,因为系统里没有当前日期的数据因此最后结果是空表,就不截图了

输入参数p1 = 20240103截图:

2.使用ABAP程序代码调用该CDS,给参数代码如下:

*&---------------------------------------------------------------------*
*& Report ZTEST_YY_10
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_yy_10.


SELECT FROM zdemo_cds_02(
  p1 = '20240103' ) FIELDS * INTO TABLE @DATA(gt_a).

cl_demo_output=>display( gt_a ).

运行结果:

不给参数代码:

SELECT FROM zdemo_cds_02 FIELDS * INTO TABLE @DATA(gt_a).

程序执行结果:0条

结论:不管那种方式因为没有给实际值,系统使用的是默认值,默认值为检索条件,没有符合的数据,所以0条


4.CDS VIEW链接查询

6.CDS VIEW Association和路径表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ABAP小码奴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值