Перейти до вмісту

CDS View Entities

ABAP CDS (Core Data Services) — інфраструктура для декларативного опису семантично багатих моделей даних на стандартній базі AS ABAP. CDS view entity — модерний наступник класичних DDIC views: запит описується в DDL, активується як CDS-сутність, доступний з ABAP SQL, може бути джерелом інших CDS-моделей і основою RAP.

На відміну від класичних views, CDS view entity підтримує анотації, асоціації, параметри, касти, вирази, session variables. Створюється тільки в ADT.

@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Demo CDS view entity'
define view entity zdemo_cds_ve
with parameters
p_carrid : s_carr_id
as select from zdemo_abap_flsch
{
key carrid,
key connid,
cityfrom,
cityto,
fltime,
:p_carrid as passed_carrid
}
where carrid = :p_carrid
  • @AccessControl.authorizationCheck — обовʼязкова. #NOT_REQUIRED — тільки для демо; у продакшні #CHECK з DCL (Data Control Language).
  • with parameters — вхідні параметри, доступні в тілі через :p_name.
  • key — ключові поля. Визначають унікальність і працюють як основа для подальших joinʼів.

Поля, літерали, session variables

Section titled “Поля, літерали, session variables”
{
key carrid, -- поле джерела
'some text' as note, -- нетипований літерал
char`X` as flag, -- типований літерал
abap.int4`42` as magic,
$session.system_date as today, -- session variable
$session.user as uname
}

Типовані літерали перевіряються на етапі активації. У ABAP Cloud — рекомендовані замість нетипованих.

{
key connid,
cast( fltime as abap.dec( 8, 2 ) ) as fltime_dec,
price + 10 as price_plus_10,
division( seatsocc, seatsmax, 2 ) as occupancy_rate
}

cast змінює тип колонки у результаті. Звертай увагу на правила конверсії — не кожен тип можна привести до будь-якого.

{
key carrid,
case currcode
when 'EUR' then 'A'
when 'USD' then 'B'
else 'C'
end as curr_group,
case when length( carrname ) <= 5 then 'short'
when length( carrname ) <= 10 then 'mid'
else 'long'
end as name_size
}

Простий case — порівняння значень операнда. Complex case — евалюація логічних виразів. Без else результат — null.

Числові (abs, ceil, floor, round, div, division, mod), рядкові (concat, concat_with_space, upper, lower, left, right, length, substring, replace, instr), coalesce, дата/час.

{
key carrid,
upper( carrname ) as name_up,
concat_with_space( carrid, carrname, 1 ) as full,
coalesce( cityto, 'N/A' ) as city
}
define view entity zdemo_cds_agg
as select from zdemo_abap_flsch
{
key carrid,
sum( fltime ) as total_fltime,
avg( fltime as abap.dec( 14, 2 ) ) as avg_fltime,
max( fltime ) as max_fltime,
count(*) as cnt
}
group by carrid

Підтримуються inner join, left outer join, right outer join, cross join.

define view entity zdemo_cds_joins
as select from zdemo_abap_flsch as fs
inner join zdemo_abap_carr as c on c.carrid = fs.carrid
left outer join zdemo_abap_fli as fl
on fl.carrid = fs.carrid and fl.connid = fs.connid
{
key fs.carrid,
key fs.connid,
c.carrname,
fl.fldate,
fl.seatsocc
}

Асоціація — “відкладений join”. Декларується у CDS, але фактично виконується тільки тоді, коли поле з асоційованої сутності реально використовується.

define view entity zdemo_cds_assoc
as select from zdemo_abap_flsch as fs
association [1..1] to zdemo_abap_carr as _carr
on $projection.carrid = _carr.carrid
association [0..*] to zdemo_abap_fli as _fli
on $projection.carrid = _fli.carrid
and $projection.connid = _fli.connid
{
key fs.carrid,
key fs.connid,
fs.cityfrom,
fs.cityto,
_carr.carrname, -- експліцитне вживання, join виконується
_carr, -- експонуємо назовні
_fli
}

Cardinality ([1..1], [0..*]) задає очікувану кратність. $projection — посилання на поточне projection view в ON-умові.

Використання експонованої асоціації в ABAP SQL через path expression (оператор \):

SELECT carrid, connid, \_carr-carrname
FROM zdemo_cds_assoc
INTO TABLE @DATA(result).

CDS view entity виступає як будь-яке інше джерело даних у SELECT:

" Запит з параметром
SELECT * FROM zdemo_cds_ve( p_carrid = 'LH' )
INTO TABLE @DATA(result).
" Типізація локальних змінних через CDS view entity
DATA ls_row TYPE zdemo_cds_ve.
DATA lt_tab TYPE TABLE OF zdemo_cds_ve WITH EMPTY KEY.

Анотації задають метадані, які керують поведінкою CDS в UI, OData, RAP, авторизації, пошукових допомогах.

АнотаціяПризначення
@AccessControl.authorizationCheck#CHECK / #NOT_REQUIRED / #NOT_ALLOWED
@EndUserText.labelОпис для tooling і UI
@Semantics.amount.currencyCodeЗвʼязати amount-поле з currency key
@Semantics.quantity.unitOfMeasureЗвʼязати quantity-поле з unit key
@ObjectModel.*Метадані RAP бізнес-обʼєктів

Базові view entities — read-only. Для CRUD (створення/оновлення/видалення) потрібна CDS table entity + RAP behavior definition, або writable projection view поверх RAP BO. Це тема окремого довідника з RAP.

Адаптовано з 15_CDS_View_Entities.md (Apache 2.0). Повний перелік нюансів — в оригіналі.