Академический Документы
Профессиональный Документы
Культура Документы
Services)
Начиная с версии ABAP 7.4. нам стала доступна новая технология описания
моделей данных в словаре – ABAP CDS (CDS – Core Data Services). Данная
технология позволяет описывать модели данных на более продвинутом уровне,
нежели это можно было делать стандартными словарными вьюшками. Она так же
позволяет оптимизировать работу с данными за счёт вынесения вычислений на
уровень СУБД (Code-to-Data), что актуально для HANA.
Кроме ABAP CDS, есть так же отдельная реализация для HANA – HANA CDS. Как
понятно из названия, одна реализация используется в ABAP разработке, другая в
HANA Native разработке. Horst Keller в своём блоге более подробно рассматривает
разницу в обоих реализациях.
ABAP CDS поддерживается сервером приложений ABAP вне зависимости от того,
какая СУБД будет им использована, однако некоторые специфические вещи могут
и не поддерживаться (В ABAP 7.4. нет поддержки параметров у CDS для всех
СУБД, она появилась только с ABAP 7.5. Кроме того, скорость работы CDS на
HANA и Oracle может быть различной).
В статье будет рассмотрена версия ABAP CDS для ABAP 7.4, с некоторыми
комментариями относительно ABAP 7.5.
Прежде чем приступать к примерам, рассмотрим основные понятия в контексте
ABAP CDS:
ABAP CDS
2
Создание
Создать CDS View можно только из ABAP Development Tools (Eclipse plugin,
скачать можно с сайта: https://tools.hana.ondemand.com). Для этого необходимо
сначала создать ABAP проект в системе, а затем добавить к нему новый объект:
3
Параметры CDS
На следующем шаге необходимо указать настройки транспорта, а после него
выбрать шаблон CDS который будет вставлен в DDL по умолчанию:
Шаблон DDL
Eclipse позволяет самим определять шаблоны DDL через настройки:
4
Настройка шаблонов
После выбора шаблона по умолчанию, нажимаем на кнопку finish и имеем
следующий результат:
1 @AbapCatalog.sqlViewName: 'sql_view_name'
2 @AbapCatalog.compiler.compareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'Описание DDL'
5 define view Zddl_Sample as select from data_source_name {
6
7}
5
Графический редактор CDS
Изменим наш DDL на следующий:
1 @AbapCatalog.sqlViewName: 'zsql_view'
2 @AbapCatalog.compiler.CompareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'Описание DDL'
5 define view zstob_ddl_sample as select from spfli { * }
6
Объекты TADIR
В словаре (SE11) можем посмотреть на DB View:
CDS DB View
Однако просмотр DB View в SE11 не самая лучшая идея, так как в нём вы не
увидите некоторых специфичных для CDS вещей, например: UNION ALL, LEFT
OUTER JOIN и пр. Для того чтобы их увидеть, необходимо перейти по
следующему меню:
Просмотр объекта БД
Тут вы получите описание на уровне СУБД, поле манданта (клиента)
было вставлено автоматически:
7
Объект БД
Просмотр данных
После того как DDL будет активирован, мы можем посмотреть содержимое CDS
VIew. Для просмотра можно нажать F8 (ADT 2.31 / ABAP 7.40 SP08) прямо в
редакторе DDL, так выглядит интерфейс просмотра:
Просмотр данных
8
Инструмент Data Preview так же позволяет проходить по ассоциациям (о которых
будем говорить чуть позже):
Переход по ассоциациям
Просмотреть данные мы можем и из SQL консоли ADT, оценив одновременно
скорость выборки:
Буферизация
Буферизация для CDS View работает по тем же правилам, что и для DB View.
Буферизация CDS View возможна только в том случае, если среди источников
данных нет других view (DB View или CDS View).
Настройка буферизации осуществляется через следующие аннотации:
AbapCatalog.buffering.status – определяет, активна или нет буферизация,
возможные значения:
Для CDS Entity, ключевое слово KEY может задать семантический ключ.
Который используется при неявных проверках полномочий определенных в DCL
(ABAP 7.5).
Ключ для CDS DB View задаётся автоматически по тем же правилам что и для
обычных словарных View, данный ключ является техническим.
Joins
10
1 @AbapCatalog.sqlViewName: 'zddl_join'
2 @AbapCatalog.compiler.CompareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'LEFT OUTER SAMPLE'
5 define view Zddl_Join_Sample as select distinct from spfli
6 left outer join sgeocity
7 on spfli.countryfr = sgeocity.country and
8 spfli.cityfrom = sgeocity.city {
9 spfli.cityfrom,
10 spfli.countryfr,
11 sgeocity.latitude
12 } where spfli.carrid = 'AZ';
На выходе получаем:
NULL значения
На своей системе я специально удалил запись с городом ROME из таблицы sgeocity
чтобы показать каким образом будет обработан запрос. В данном случае NULL
значение было заменено на начальное для типа столбца latitude.
Обработка клиента
11
Вставить её необходимо до определения view (define view). При этом после
активации DDL, CDS DB View уже не будет содержать поле клиента по
умолчанию.
Еще один способ отключить обработку клиента использовать дополнение CLIENT
SPECIFIED в ABAP:
Следует отметить так же важную особенность, если одна CDS View будет
использовать в качестве источника данных другую CDS View с зависимостью от
клиента, тогда она так же будет зависима от клиента.
Ассоциации
Для упрощения понимания CDS View были введены так называемые ассоциации,
которые по своей сути являются теми же JOIN, но в более простой для восприятия
форме и с более широкими возможностями.
Рассмотрим пример:
1 @AbapCatalog.sqlViewName: 'zsql_view'
2 @AbapCatalog.compiler.CompareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'Описание DDL'
5 define view zstob_ddl_sample
6 as select from spfli
7 association [1..1] to scarr as airline on spfli.carrid = airline.carrid
8 { spfli.airpfrom,
9 spfli.airpto,
10 spfli.carrid,
11
12
12 airline.carrname,
13 spfli.arrtime,
14 spfli.connid
15 };
1 @AbapCatalog.sqlViewName: 'zsql_view'
2 @AbapCatalog.compiler.CompareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'Описание DDL'
5 define view zstob_ddl_sample
6 as select from spfli
7 association [1..1] to scarr as airline on spfli.carrid = airline.carrid
8 { spfli.airpfrom,
9 spfli.airpto,
10 spfli.carrid,
11
12 airline, // Ассоциация будет доступна извне
13 spfli.arrtime,
14 spfli.connid
15 };
1 @AbapCatalog.sqlViewName: 'zstob_ex'
13
2 @AbapCatalog.compiler.CompareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'zddl_external_as'
5 define view Zddl_External_As as select from zstob_ddl_sample {
6 zstob_ddl_sample.airline.carrid,
7 zstob_ddl_sample.airline.carrname,
8 zstob_ddl_sample.airline.currcode
9}
1 select cityfrom,
2 countryfr,
3 \geoinfo-latitude as latitude
4 from Zddl_assoc_Sample.
Кардинальность ассоциаций
В квадратных скобках ассоциации указывается кардинальность, которая помогает
пользователям понять каким образом связаны данные и произвести оптимизацию
при создании JOIN’ов для HANA. Синтаксис следующий [<min>..<max>], <min> –
может быть опущено, по умолчанию 0. При описании кардинальности может быть
использована *, которая означает – любое число записей. Максимальное число не
может быть нулевым, а минимальное не может быть – *. Кардинальность не
обязательно к указанию, тогда будет выставлена по умолчанию [0..1].
Типы JOIN’ов в описании ассоциаций
По умолчанию тип JOIN определяется от того где в DDL прописана ассоциация: в
SELECT, FROM, WHERE, GROUP BY. Если ассоциация указана в FROM по
умолчанию будет использован INNER JOIN, в остальных случаях LEFT OUTER
JOIN.
Пример в SELECT:
JOIN:
14
Пример в FROM:
JOIN:
Кроме того тип JOIN’a может быть переопределен когда мы получаем доступ к
ассоциации через path expression:
1 @AbapCatalog.sqlViewName: 'zddl_assoc_ex'
2 @AbapCatalog.compiler.CompareFilter: tue
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'association sample'
15
5 define view Zddl_assoc_cds as select from Zddl_assoc_Sample {
6 cityfrom,
7 countryfr,
8 geoinfo[inner].latitude
9 };
Правила переопределения.
Ключевое слово $projection может быть использовано для доступа к полю в
ассоциации для которого задан alias:
1 @AbapCatalog.sqlViewName: 'Ztest_Ddl7_sql'
2 @AbapCatalog.compiler.CompareFilter: true
3 @AccessControl.authorizationCheck: #CHECK
4 @EndUserText.label: 'test'
5 define view zstob_ddl_sample7
6 as select from spfli
7 association [1..1] to sgeocity as _geocity on $projection.city = _geocity.city and
8 spfli.countryfr = _geocity.country
9 {
10 key spfli.carrid,
11 key spfli.connid,
12 spfli.cityfrom as city
13 };
Фильтрация в ассоциации
Используя ассоциации, Вы так же можете добавлять свои критерии фильтрации,
указывая их в WHERE условии:
16
Как видно из картинки, фильтр переходит в условие JOIN.
При использовании ассоциации с одним и тем же фильтром или без фильтра, если
не указана аннотация CompareFilter со значением true, то для каждого поля из
ассоциации генерируется отдельный JOIN:
17
Отключенный CompareFilter
Если же мы поставим CompareFilter в true, результат будет уже иным:
Включенный CompareFilter
Это важно с точки зрения оптимизации и лучше чтобы оптимизация всегда была
включена.
18
CDS View с параметрами
Предупреждение о параметрах
Можно спрятать предупреждение и выполнить проверку:
19
В ABAP 7.5 добавилась возможность использования переменных сессии, например
$session.user будет содержать внутри себя sy-uname. Подробнее в документации.
Параметры могут быть использованы как элементы в перечне полей для выбора:
1 @AbapCatalog.sqlViewName: 'SPFLI_PROJECTION'
2 define view spfli_proj
3 with parameters p1 : abap.int4,
4 p2 : abap.int4 as
5 select from scarr
6 { key carrid,
7 :p1 as para1,
8 $parameters.p2 as para2
9 };
Code Pushdown
20
10 round( dec3, 2 ) as round_dec3,
11 concat( char1, char2 ) as concat_char1_char2,
12 lpad( char1, 10, 'x' ) as lpad_char1,
13 replace( char2, 'GHI', 'XXX' ) as replace_char2,
14 substring( char2, 2, 3 ) as substring_char2 }
21
11 distance < 2000 then 'medium-haul flight'
12 when distance < 1000 then 'short-haul flight'
13 else 'error'
14 end as flight_type }
15 where distid = 'MI'
IDA ALV (List Viewer with Integrated Data Access) – это расширение библиотеки
SALV (Simple ALV), которое позволяет обрабатывать большие массивы данных, не
передавая все данные разом на сервер приложений (представления). По сути, Вам
не требуется заполнять внутреннюю таблицу для передачи её в salv класс,
достаточно указать источник данных. IDA ALV используя функции агрегаций
будет отображать результат их вычислений.
Простейший пример:
1 cl_salv_gui_table_ida=>create( iv_table_name = 'SBOOK' )->fullscreen( )->display( ).
Вы можете расширять стандартные CDS View при этом без указания ключа
разработчика. Синтаксис расширения является частью DDL и реализован
ключевым словом Extend View. Расширение подразумевает создание
дополнительных полей, аннотаций, расчётных полей и параметров к расширяемому
CDS View.
Технически расширение реализовано за счёт Append View к Database View
исходного CDS View, в связи с чем, перед ключевым словом Extend View
необходимо указать аннотацию @AbapCatalog.sqlViewAppendName:
‘<ИмяAppendView>’.
На текущий момент нельзя расширять CDS View следующих типов:
1 @AbapCatalog.sqlViewName: 'BPA_VW'
2 define view business_partner
3 (id, role, company_name, phone_number) as
4 select from snwd_bpa
5 { key snwd_bpa.bp_id,
6 snwd_bpa.bp_role,
7 snwd_bpa.company_name,
8 snwd_bpa.phone_number }
23
1 @AbapCatalog.sqlViewAppendName: 'zddl_append_view'
2 @EndUserText.label: 'Пример расширения CDS View'
3 extend view demo_cds_spfli with zddl_extension {
4 spfli.distance,
5 spfli.distid as unit
6}
Результат расширения
Если в качестве источника данных в Вашем CDS View прозрачная таблица или DB
View, Вы можете указать специальное дополнение $EXTENSION.*, чтобы кроме
указанных полей из таблицы выбирались так же те, которые будут добавлены в
расширении к этому словарному объекту (Естественное если мы изначально не
указали что будем выбирать все поля “*”). После активации расширения, все
связанные таким образом CDS View будут автоматически адаптированы.
24
Подробная документация по расширениям CDS доступна в справке.
Ошибки активации
При активации CDS у Вас могут возникать ошибки активации, для того чтобы их
посмотреть нужно перейти по меню Navigate -> Open activation log:
Как уже было упомянуто ранее, CDS в ABAP 7.4 представлено двумя основными
сущностями – CDS View и CDS Role. CDS View описывают модели данных, CDS
Role определяют полномочия на доступ к этим моделям.
Статья на тему того как работает данный функционал. Обратите внимание, что в
ABAP 7.4 оно работает только с определённой версии SP.
Источники
HA400
S4H410.
25