ABAP CDS (Core Data 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

ABAP CDS

  • CDS Object – обобщенное понятие объекта репозитория, создаваемого через исходный код CDS.  К CDS Object относятся либо CDS Entity (DDL), либо CDS Role (DCL). Найти все DDL в системе можно через таблицу TADIR по следующим ключам: R3TR DDLS <DDL SourceName>. Все DCL можно найти в TADIR по ключам: R3TR DCLS <DCL SourceName>.
  • CDS Entity – это CDS объект, управляемый ABAP словарём, создаваемый путём описания на специальном языке — Data Defenition Language (DDL). Объект не переносится транспортом, вместо этого он генерируется в системе во время активации исходного кода DDL с которым он связан. Хранится такой объект в TADIR с ключом: R3TR STOB <EntityName>, где STOB – Structured object. В ABAP 7.4. к CDS Entity относится лишь CDS View, в 7.5. добавили еще CDS Table function (по сути это AMDP, которая реализует CDS и позволяет использовать SQL Script для формирования данных CDS, в статье Table function не рассматриваются). CDS View — это основной объект с которым мы имеем дело в ABAP при чтении данных из словаря. На CDS View можно ссылаться при объявлении ABAP переменных, однако этот объект нельзя использовать при описании словарных объектов. Каждая новая CDS View должна быть описана в отдельном DDL объекте.  Имя CDS View определяется сразу после ключевого слова DEFINE VIEW в DDL (пример ниже), рекомендуется использовать имя такое же как у DDL объекта. Создаются они на базе существующих источников данных из словаря – таблиц (поддерживаются только прозрачные таблицы, пул таблиц и кластерные таблицы не поддерживаются), классических словарных вьюшек и других CDS. CDS Entity не доступны из Native SQL, а OpenSQL поддерживает только операции чтения.
  • CDS Role – объекты описывающие необходимые проверки полномочий для доступа к CDS View. CDS Role создаются путём их описания в DCL (Data control language) объекте.
  • CDS Database View – объект словаря, который как и CDS View генерируется во время активации DDL объекта. Объект в TADIR можно найти по ключу: R3TR VIEW. По сути, это классический read-only database view из словаря. Имя CDS DB View указывается через аннотацию — @AbapCatalog.sqlViewName, а текстовое описание через @EndUserText.label. Просмотреть данное view можно через SE11, но отредактировать только в ADT. В ABAP можно считать данные напрямую из CDS DB View, однако это не рекомендуется делать и данный способ уже считается устаревшим в ABAP 7.5. В отличие от CDS VIew, CDS DB View можно использовать при описании объектов словаря.

Упомянутые выше аннотации это своего рода мета-информация об объекте CDS, которая может в себя включать как настройки (буферизация, ссылочные поля для валюты и т.п.), так и только описательные данные (текстовое описание поля, описание DB View и прочее).

Подробная информация о существующих аннотациях есть в документации (для ABAP 7.5).

В ABAP 7.5 с помощью аннотаций можно даже опубликовать OData сервис на базе CDS View, при этом используя описательные аннотации можно задавать свойства UI элементов в UI5 (Fiori) приложениях (ABAP 7.5 SP01 и выше). Блог, в котором рассматриваются эти и другие возможности аннотаций (ABAP 7.5).

Работа с CDS View

 

Создание

 

Создать CDS View можно только из ABAP Development Tools (Eclipse plugin, скачать можно с сайта: https://tools.hana.ondemand.com). Для этого необходимо сначала создать ABAP проект в системе, а затем добавить к нему новый объект:

Создание CDS View

Создание CDS View

В 7.5 путь в мастере несколько отличается, CDS вынесены в отдельную папку.

Далее указывается имя DDL объекта CDS:

Параметры CDS

Параметры CDS

На следующем шаге необходимо указать настройки транспорта, а после него выбрать шаблон CDS который будет вставлен в DDL по умолчанию:

Шаблон DDL

Шаблон DDL

Eclipse позволяет самим определять шаблоны DDL через настройки:

Настройка шаблонов

Настройка шаблонов

После выбора шаблона по умолчанию, нажимаем на кнопку finish и имеем следующий результат:

В итоге в объекте DDL мы создали CDS View zddl_sample, которая по сути является запросом SQL к источнику данных data_source_name. Кстати синтаксис DDL и DCL позволяет использовать комментарии // (—) — для однострочных и /* … */ — для многострочных. Более подробно о правилах синтаксиса можно почитать в документации.

Начиная с ABAP 7.50 SP01 кроме текстового редактора, доступен графический редактор CDS:

Графический редактор CDS

Графический редактор CDS

Изменим наш DDL на следующий:

В данном примере мы определили cds view zstob_ddl_sample, как запрос всех данных из таблицы spfli. Так как поля явным образом не заданы, будут выбраны все ( * ). С некоторыми используемыми аннотациями мы уже знакомы, остальные будут рассмотрены чуть позже.

После активации DDL, в TADIR мы получим следующие объекты:

Объекты TADIR

Объекты TADIR

В словаре (SE11) можем посмотреть на DB View:

CDS DB View

CDS DB View

Однако просмотр DB View в SE11 не самая лучшая идея, так как в нём вы не увидите некоторых специфичных для CDS вещей, например: UNION ALL, LEFT OUTER JOIN и пр. Для того чтобы их увидеть, необходимо перейти по следующему меню:

Просмотр объекта БД

Просмотр объекта БД

Тут вы получите описание на уровне СУБД, поле манданта (клиента) было вставлено автоматически:

Объект БД

Объект БД

Просмотр данных

 

После того как DDL будет активирован, мы можем посмотреть содержимое CDS VIew. Для просмотра можно нажать F8 (ADT 2.31 / ABAP 7.40 SP08) прямо в редакторе DDL, так выглядит интерфейс просмотра:

Просмотр данных

Просмотр данных

Инструмент Data Preview так же позволяет проходить по ассоциациям (о которых будем говорить чуть позже):

Переход по ассоциациям

Переход по ассоциациям

Просмотреть данные мы можем и из SQL консоли ADT, оценив одновременно скорость выборки:

Просмотр данных из консоли

Просмотр данных из консоли

Буферизация

 

Буферизация для CDS View работает по тем же правилам, что и для DB View. Буферизация CDS View возможна только в том случае, если среди источников данных нет других view (DB View или CDS View).

Настройка буферизации осуществляется через следующие аннотации:

AbapCatalog.buffering.status – определяет, активна или нет буферизация, возможные значения:

  • #ACTIVE: Буферизация активна.
  • #SWITCHED_OFF: Буферизация возможна, но неактивна (по умолчанию).
  • #NOT_ALLOWED: Буферизация запрещена.

AbapCatalog.buffering.type – определяет тип буферизации, возможные значения:

  • #SINGLE: Отдельная запись
  • #GENERIC: Родовая область
  • #FULL: Полная буферизация
  • #NONE: Буферизация отключена (По умолчанию)

AbapCatalog.buffering.numberOfKeyFields – количество ключевых полей, относительно которых происходит буферизация, только для буферизации по родовой области (Generic). Может принимать значения от 0 до k-1, где k – количество ключевых полей.

CDS View содержат два типа определения ключей:

  • Для CDS Entity, ключевое слово KEY может задать семантический ключ. Который используется при неявных проверках полномочий определенных в DCL (ABAP 7.5).
  • Ключ для CDS DB View задаётся автоматически по тем же правилам что и для обычных словарных View, данный ключ является техническим.

Для буферизации всегда будет актуальным технический ключ (который можно посмотреть в SE11 к DB View).

В OpenSQL ключевые поля используемые в запросе с ORDER BY PRIMARY KEY будут определены в зависимости от источника, к которому вы обращаетесь, как уже говорилось это может быть DB VIew (не следует использовать) или CDS View.

SAP рекомендует всегда указывать семантический ключ для CDS View, т.к. его наличие необходимо для ABAP фреймворков использующих CDS, например — IDA ALV.

Joins

 

Одним из отличий CDS View от обычных DB View,  является поддержка двух дополнительных типов JOIN’ов, LEFT OUTER JOIN и RIGHT OUTER JOIN.

Применяя эти типы JOIN’oв мы можем столкнуться с ситуацией, когда данные из левой/правой таблицы будут содержать NULL значения. Для обработки NULL значений можно в DDL использовать условие IS [NOT] NULL и функцию COALESCE. Так как в ABAP нет типа обозначающего NULL, это значение будет автоматически преобразовано к INITIAL значению типа столбца.

Пример LEFT OUTER JOIN CDS View:

На выходе получаем:

NULL значения

NULL значения

На своей системе я специально удалил запись с городом ROME из таблицы sgeocity чтобы показать каким образом будет обработан запрос. В данном случае NULL значение было заменено на начальное для типа столбца latitude.

Обработка клиента

 

Одним из отличий ABAP CDS от HANA CDS является автоматическая поддержка клиента, то есть Вам не нужно объявлять поле клиента (манданта) при создании View, система сделает это неявным образом (В CDS DB View поле клиента будет вставлено автоматически). Есть возможность отключения автоматической обработки клиента, для этого необходимо использовать аннотацию:

@ClientDependent: false

Вставить её необходимо до определения view (define view). При этом после активации DDL, CDS DB View уже не будет содержать поле клиента по умолчанию.

Еще один способ отключить обработку клиента использовать дополнение CLIENT SPECIFIED в ABAP:

Следует отметить так же важную особенность, если одна CDS View будет использовать в качестве источника данных другую CDS View с зависимостью от клиента, тогда она так же будет зависима от клиента.

Ассоциации

 

Для упрощения понимания CDS View были введены так называемые ассоциации, которые по своей сути являются теми же JOIN, но в более простой для восприятия форме и с более широкими возможностями.

Рассмотрим пример:

В примере мы создали CDS View на основе данных о расписании авиарейсов (SPFLI) и ассоциации их с данными о компании через соединение по carrid. При активации DDL, ассоциация будет преобразована в JOIN. В примере мы задали имя для ассоциации airline, однако этого можно было и не делать, тогда имя будет неявным образом тем же самым что у привязанного источника данных, в нашем случае это таблица scarr. SAP рекомендует использовать подчёркивание перед именем ассоциации, это необходимо чтобы избежать возможных конфликтов с именами полей таблиц.

В примере ассоциация используется для получения поля CARRNAME, то есть сама не видна извне. Однако CDS View позволяют вынести ассоциацию наверх, чтобы можно её было использовать в других CDS View, пример:

Используем ассоциацию в другом CDS View:

Начиная с ABAP 7.5, OpenSQL позволяет использовать ассоциации и выбирать из них данные, пример:

Кардинальность ассоциаций

В квадратных скобках ассоциации указывается кардинальность, которая помогает пользователям понять каким образом связаны данные и произвести оптимизацию при создании JOIN’ов для HANA. Синтаксис следующий [<min>..<max>], <min> — может быть опущено, по умолчанию 0. При описании кардинальности может быть использована *, которая означает – любое число записей. Максимальное число не может быть нулевым, а минимальное не может быть — *. Кардинальность не обязательно к указанию, тогда будет выставлена по умолчанию [0..1].

Типы JOIN’ов в описании ассоциаций

По умолчанию тип JOIN определяется от того где в DDL прописана ассоциация: в SELECT, FROM, WHERE, GROUP BY. Если ассоциация указана в FROM по умолчанию будет использован INNER JOIN, в остальных случаях LEFT OUTER JOIN.

Пример в SELECT:

JOIN:

JOINSelect

Пример в FROM:

JOIN:

JOINFrom

Кроме того тип JOIN’a может быть переопределен когда мы получаем доступ к ассоциации через path expression:

Правила переопределения.

Ключевое слово $projection может быть использовано для доступа к полю в ассоциации для которого задан alias:

Фильтрация в ассоциации

Используя ассоциации, Вы так же можете добавлять свои критерии фильтрации, указывая их в WHERE условии:

filterCDS

Как видно из картинки, фильтр переходит в условие JOIN.

При использовании ассоциации с одним и тем же фильтром или без фильтра, если не указана аннотация CompareFilter со значением true, то для каждого поля из ассоциации генерируется отдельный JOIN:

Отключенный CompareFilter

Отключенный CompareFilter

Если же мы поставим CompareFilter в true, результат будет уже иным:

Включенный CompareFilter

Включенный CompareFilter

Это важно с точки зрения оптимизации и лучше чтобы оптимизация всегда была включена.

CDS View с параметрами

 

Внутрь CDS view можно передавать параметры, основное предназначение которых сделать наши CDS более гибкими с возможностью передача их значений внутрь условий where, внутрь функций и выражений, а так же в условия JOIN.

Определяются параметры с помощью ключевого слова WITH PARAMETERS до ключевого слова SELECT. При определении параметра указывается его имя и тип данных. При указании типа можно ссылаться как на элементы данных, так и на DDIC типы, указав префикс abap (abap.int4). Более подробное описание типов смотрите в документации.

Пример:

SQL запрос к CDS View с параметром:

При выборке данных с передачей параметров в ABAP 7.4. будет показано предупреждение о том, что нужно проверить поддерживает ли СУБД передачу параметров в CDS View:

Предупреждение о параметрах

Предупреждение о параметрах

Можно спрятать предупреждение и выполнить проверку:

Если СУБД не поддерживает передачу параметров, при выполнении SQL запроса будет вызвано исключение — CX_SY_SQL_UNSUPPORTED_FEATURE. Напомню что в ABAP 7.5 параметры стали доступны для всех СУБД.

В ABAP 7.5 добавилась возможность использования переменных сессии, например $session.user будет содержать внутри себя sy-uname. Подробнее в документации.

Параметры могут быть использованы как элементы в перечне полей для выбора:

Code Pushdown

 

Code Pushdown подразумевает собой перенос логики расчёта на уровень СУБД, данный подход оправдывает себя (с точки зрения производительности) когда вы например используете SAP HANA или ваш сервер СУБД заметно мощнее чем сервер приложений.

Сам перенос расчёта подразумевает широкое использование выражений SQL в CDS View, которые имеют больше возможностей, чем в OpenSQL (В планах развития OpenSQL поддержка всех функций CDS).

Стандартный пример CDS View с SQL функциями:

Описание функций можно найти в официальной документации или по F1.

Пример использования функции конвертации валюты:

Кроме непосредственно функций можно так же использовать литералы, арифметические выражения и условный оператор CASE. Пример с CASE:

В ABAP 7.5. набор возможностей CDS еще шире.

Просмотр в IDA ALV

 

IDA ALV (List Viewer with Integrated Data Access) – это расширение библиотеки SALV (Simple ALV), которое позволяет обрабатывать большие массивы данных, не передавая все данные разом на сервер приложений (представления). По сути, Вам не требуется заполнять внутреннюю таблицу для передачи её в salv класс, достаточно указать источник данных. IDA ALV используя функции агрегаций будет отображать результат их вычислений.

Простейший пример:

Во время прокрутки списка в IDA ALV, сервер приложений будет генерировать запросы похожие на следующий:

IDA ALV Trace

IDA ALV Trace

То есть вместо полной выборки будут использованы команды по смещению. Приведенный выше синтаксис использует СУБД HANA. Более подробные примеры использования IDA ALV можно найти в пакете: SALV_IDA_TEST.  Так же доступна документация.

Расширение CDS

 

Вы можете расширять стандартные CDS View при этом без указания ключа разработчика. Синтаксис расширения является частью DDL и реализован ключевым словом Extend View. Расширение подразумевает создание дополнительных полей, аннотаций, расчётных полей и параметров к расширяемому CDS View.

Технически расширение реализовано за счёт Append View к Database View исходного CDS View, в связи с чем, перед ключевым словом Extend View необходимо указать аннотацию @AbapCatalog.sqlViewAppendName: ‘<ИмяAppendView>’.

На текущий момент нельзя расширять CDS View следующих типов:

  • View у которых явно определены имена полей, пример:

  • View в которых используются агрегатные функции и выражение GROUP BY.
  • View в которых используется объединение через UNION.
  • View которые сами являются расширениями.

Агрегатные функции так же нельзя использовать в ваших расширениях. Рекомендуется начинать добавляемые поля с префикса Z (Y), чтобы не возникало конфликтов имён. Добавляемые поля не могут быть помечены как семантический ключ через ключевое слово KEY. Так же нельзя переопределить свойства буферизации через соответствующие аннотации.

После того как расширение будет перенесено через транспортную систему, комбинацию имени AppendView и имени расширенного CDS View уже нельзя будет переопределить.

Пример:

В примере мы расширили CDS View demo_cds_spfli добавив новые поля, исходный код CDS:

Результат расширения, два новых поля:

Результат расширения

Результат расширения

Если в качестве источника данных в Вашем CDS View прозрачная таблица или DB View, Вы можете указать специальное дополнение $EXTENSION.*, чтобы кроме указанных полей из таблицы выбирались так же те, которые будут добавлены в расширении к этому словарному объекту (Естественное если мы изначально не указали что будем выбирать все поля «*»). После активации расширения, все связанные таким образом CDS View будут автоматически адаптированы.

Подробная документация по расширениям CDS доступна в справке.

Ошибки активации

 

При активации CDS у Вас могут возникать ошибки активации, для того чтобы их посмотреть нужно перейти по меню Navigate -> Open activation log:

Журнал активации Eclipse

Журнал активации Eclipse

Далее зажав Ctrl щелкаете по журналу, где уже будет более развернутая информация, по которой Вы сможете понять суть ошибки.

Работа с CDS Role

 

Как уже было упомянуто ранее, CDS в ABAP 7.4 представлено двумя основными сущностями – CDS View и CDS Role. CDS View описывают модели данных, CDS Role определяют полномочия на доступ к этим моделям.

К сожалению, данный функционал  работает начиная с в версии ABAP 7.5 и в данной статье он не рассматривается.

Источники

 

На SCN есть сборный документ, включающий в себя подробное описание CDS. Кроме него есть еще очень любопытный документ, где собраны все возможности CDS в рамках версий систем, позволяющий понять, что можно использовать на вашей версии.

Курсы от SAP в которых рассматриваются ABAP CDS:

  • HA400
  • S4H410.
  • Kostik Kuznetsoff

    Очень интересно и полезно, спасибо.
    Я так понимаю на производительности программ и выборок это никак не скажется, но сам процесс написания выборок упрощается, а так же есть возможность использовать одни и те же выборки для разных программ. Смущает конечно использование Eclipse у меня на компе при соединении с SAP он жутко тормозит 🙂