目录
一、参数规则
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条