Вы находитесь на странице: 1из 17

ABAP CDS.

Определение
ракурсов и профилей в
репозитарии. (S4D430)
Оглавление
ABAP CDS. Определение ракурсов и профилей в репозитарии. (S4D430) ..................... 1
0. Зачем это нужно ............................................................................................................................. 2
1. Введение ......................................................................................................................................... 4
2. Основы CDS view ........................................................................................................................... 6
3. Простые возможности: вычисление, соединения, объединения .......................................... 7
3.1. Вычислимые поля ....................................................................................................................... 7
3.2. Агрегатные функции ................................................................................................................... 9
3.3. Соединения и объединения ...................................................................................................... 9
4. Дальше — больше ....................................................................................................................... 10
4.1. Передача параметров .............................................................................................................. 10
4.2. Ассоциации ................................................................................................................................ 10
4.3. Расширения ............................................................................................................................... 12
4.4. Фильтрация по полномочиям ................................................................................................. 13
5. Табличные функции. Только для SAP HANA .......................................................................... 14
6. Использование CDS view............................................................................................................ 15
7. Заключение ................................................................................................................................... 16

1
0. Зачем это нужно
Начиная с версии 7.4 в SAP Net Weaver можно создавать в репозитарии
новые категории объектов — описания Core Data Services (CDS),
позволяющие:

— элегантно описывать ракурсы (представления, CDS view) в том числе


использующие в качестве источников другие ракурсы;

— расширять существующие CDS view, в том числе поставляемые SAP


или другими поставщиками, описания ролей доступа;

— создавать роли доступа, фильтрация по которым будет происходить на


уровне базы данных, а не на уровне ABAP-приложения.

Подавляющее большинство нововведений платформенно независимы и


могут использоваться со всеми теми базами данных, с которыми может
работать SAP Net Weaver. В настоящее время таких баз данных 9. Особый
интерес представляет использование ABAP CDS с базой данных SAP
HANA (High Performance Analytic Appliance), поскольку в таком случае
можно использовать особенности, присущие этой базе данных.
Концепции, основные возможности, синтаксические конструкции,
наиболее интересные способы применения Core Data Services (в первую
очередь CDS view) изучаются в трехдневном
семинаре S4D430. Создание ракурсов Core Data Services ABAP (CDS
ABAP) .

Стандартный язык структурированных запросов SQL(structured query


language) содержит в себе 4 важных подмножества: язык
манипулирования данными (Data Manipulation Language, DML), язык
определения данных (Data Definition Language, DDL), язык доступа к

2
данным (Data Control Language, DCL), язык управления транзакциями
(Transaction Control Language, TCL).

Реализованное в ABAP подмножество SQL — OpenSQL — включает в


себя часть возможностей языка манипулирования данными: команды
ABAP: SELECT, DELETE, INSERT, UPDATE, OPEN CURSOR, FETCH
CURSOR, CLOSE CURSOR, дополнительную команду MODIFY,
комбинирующую возможности INSERT и UPDATE и языка управления
транзакциями: команды ABAP: COMMIT WORK и ROLLBACK WORK (а
также COMMIT CONNECTION и ROLLBACK CONNECTION).
Возможности языков манипулирования данными и доступа к данным в
ABAP не реализованы. Создание, изменение и удаление объектов базы
данных возможны средствами Словаря Данных (пишу с прописной буквы
в знак моего особого уважения к этому инструменту) при активации
созданных или измененных таблиц или ракурсов (представлений, view) на
сервер базы данных действительно посылаются
команды CREATE, ALTER или DROP, но непосредственно в ABAP коде
эти команды не поддерживаются. Словарю Данных посвящен очень
важный трехдневный семинар BC430 .
Проверка полномочий осуществляется командой языка ABAP AUTHORITY
CHECK. Важно, что эта проверка происходит не на уровне базы данных, а
именно на сервере в приложений в ABAP программе. С одной стороны,
это позволяет описывать в ABAP программе различные сценарии реакции
на отсутствие полномочий, но с другой стороны - для этого нужно
предварительно получить данные до проведения проверки. То есть,
приходится либо получать из базы данных лишние данные, либо
устраивать лишние выборки. А это может существенно снизить
производительность. За гибкость платим производительностью.

Вот эти недостатки и разрешаются с помощью нового средства Core Data


Services (CDS), в CDS можно создать DDL- и DCL-описания. В итоге ABAP
Open SQL и CDS ABAP покрывают основные возможности SQL.

3
1. Введение
ABAP Core Data Services создаются средствами ABAP Development Tools
(ADT) в среде разработке Eclipse (перспектива “ABAP”). CDS нельзя
создать с помощью транзакций разработчика, подобных SE11 или SE80,
хотя во многих случаях в этих транзакциях можно увидеть (некоторые,
часто многие) результаты. При работе в ADT сначала создается проект, в
котором указывается, в какой SAP системе, в каком манданте и каким
пользователем ведется работа. Все, что ABAP-разработчик может
сделать с помощью «разработческих» транзакций (например SE80) можно
сделать с помощью ADT, помимо собственных инструментов ADT
позволяет использовать транзакции, но кроме того ADT предоставляет
инструменты для создания, ведения и других объектов разработки. Часть
таких возможностей изучается на семинаре HA400. Программирование
для SAP HANA на ABAP . Подробнее об этом семинаре можно прочесть в
статье ABAP для HANA. (HA400); следует заметить, что с момента выхода
этой статьи из семинара HA400 был исключен ряд тем и семинар стал
трехдневным.

CDS включает в себя описания в нотации, близкой к SQL и кроме того


аннотации, содержащие особенные, SAP-специфические, возможности,
например, тексты и семантические (смысловые) свойства полей, и
различные свойства всего сервиса в целом. Выглядеть это может,
например, так:

@AbapCatalog.sqlViewName: 'ZQK1_A'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '2.05. Annotations'
@ClientDependent: true
@AbapCatalog.buffering.type: #GENERIC
@AbapCatalog.buffering.numberOfKeyFields: 1
@AbapCatalog.buffering.status: #ACTIVE
4
define view ZQK1_B as
select from spfli as a
inner join sflight as b
on a.carrid = b.carrid
and a.connid = b.connid
{ key a.carrid
, key b.connid
, key b.fldate
, paymentsum @<Semantics.amount.currencyCode: 'CURRENCY'
, currency @<Semantics.currencyCode: true
, @Semantics.amount.currencyCode: 'CURRENCY'
price @<EndUserText.label: 'Price(label)'
@<EndUserText.quickInfo: 'Price(quickInfo)'
} where currency = 'JPY'
Первый символ аннотации всегда @. Аннотации могут предшествовать
тому, что они аннотируют, а могут следовать за аннотируемым, в
последнем случае, они начинаются с двух символов @<. В ADT весьма
удобно сделано выделение цветом различных элементов. Нотация CDS-
описания соответствует, но не совпадает с SQL, например, приведенной
выше CDS соответствует следующий SQL-оператор,
CREATE VIEW "ZQK1_A" AS SELECT
"A"."MANDT" AS "MANDT",
"A"."CARRID",
"B"."CONNID",
"B"."FLDATE",
"B"."PAYMENTSUM",
"B"."CURRENCY",
"B"."PRICE"
FROM "SPFLI" "A" INNER JOIN "SFLIGHT" "B" ON (
"A"."CARRID" = "B"."CARRID" AND
"A"."CONNID" = "B"."CONNID" AND
"A"."MANDT" = "B"."MANDT"
5
)
WHERE "B"."CURRENCY" = N'JPY'

2. Основы CDS view


При активации вышеописанного CDS в репозитарии создаются три
объекта.

(1) Описание самого сервиса как это описано во


фразе define view ZQK1_B;
(2) Описание CDS view в Словаре Данных, как это указано в описание
самого сервиса @AbapCatalog.sqlViewName: 'ZQK1_A' и в
SQL-операторе CREATE VIEW "ZQK1_A". Результаты этого CDS view
можно посмотреть, например в транзакции SE11 или получить в
ABAP-программе командой SELECT;

(3) Объект репозитария типа DDLS (Data Definition Language Source).

В транзакции SE80 выглядеть это будет примерно так:

Обычно не существует резонов различать имена сервиса (самого CDS) и


объект типа DDLS, а вот имя CDS view непременно должно от них
отличаться.

Объект типа DDLS (Data Definition Language Source) является носителем


языково-зависимых свойств: ярлычков, текстов всплывающих подсказок,
названия CDS. Эти тексты могут переводится с помощью транзакции
SE63. Аннотации, в том числе и языково-зависимые могут быть получены
в ABAP методами класса СL_DD_DDL_ANNOTATION_SERVICE.

6
3. Простые возможности: вычисление,
соединения, объединения
Вычислимые поля и агрегатные функции позволяют перенести
вычисления с уровня приложения на уровень базы данных, что может
быть особенно выгодно для высокопроизводительных баз данных.

3.1. Вычислимые поля


Выражение приведение типа CAST позволяет изменить тип операнда.
В строковых вычислениях применяются строковые функции в том числе
функции конкатенации и конкатенации с пробелами. В арифметических
вычислениях возможны обычные арифметические операторы + , - , * , / и
широкий набор арифметических функций. Непосредственно делить
целые числа нельзя, поскольку деление выводит за пределы множества
целых чисел, поэтому перед делением придется приводить
целочисленные операнды к подходящему типу данных, например к типу c
плавающей точкой abap.fltp.
Особенно приятна возможность преобразования единиц измерения и
курсов валют на уровне базы данных. Для этого существуют
функции unit_conversion и currency_conversion. Конечно, различные базы
данных ничего не знают об этих функциях SAP, но соответствующие
преобразования все равно будут проводится на уровне базы данных.
Например CDS-определению:
select from spfli
{ carrid
, connid
, distance
, distid
, case distid
when 'KM' then distance
when 'MI' then unit_conversion( quantity => distance

7
, source_unit => distid
, target_unit => cast( 'KM' as abap.unit ) )
end as dist_km
}

может соответствовать такой SQL-оператор:

CREATE VIEW "ZQK1_A" AS SELECT


"SPFLI"."MANDT" AS "MANDT",
"SPFLI"."CARRID",
"SPFLI"."CONNID",
"SPFLI"."DISTANCE",
"SPFLI"."DISTID",
CASE "SPFLI"."DISTID" WHEN N'KM' THEN "SPFLI"."DISTANCE" WHEN
N'MI' THEN (
CAST(
ROUND(
CAST(
CONVERT_UNIT(
"QUANTITY" => "SPFLI"."DISTANCE",
"SOURCE_UNIT" => "SPFLI"."DISTID",
"TARGET_UNIT" => CAST(
N'KM' AS NVARCHAR(000003)
),
"CLIENT" => "SPFLI"."MANDT",
"ERROR_HANDLING" => N'FAIL_ON_ERROR',
"SCHEMA" => CURRENT_SCHEMA
) AS DECIMAL
),
000014
) AS DECIMAL(000031,000014)
)

8
)
END AS "DIST_KM"
FROM "SPFLI" "SPFLI"
В вычислимых полях возможны две формы CASE (факультативные
синтаксические элементы даны в курсивом в квадратных скобках):
CASE операнд
WHEN операнд_1 THEN результат_1
[WHEN операнд_2 THEN результат_2
...]
[ELSE результат_n]
END ...

CASE WHEN условие_1 THEN результат_1


[WHEN условие_2 THEN результат_2
...]
[ELSE результат_n]
END ...

3.2. Агрегатные функции


Агрегатные функции позволяют сразу получать итоговые результаты из
базы данных, вместо того, чтобы таскать все индивидуальные записи.
Допустимы следующие агрегатные
функции COUNT(*), SUM( операнд ), AVG( операнд ), MIN( операнд ), M
AX( операнд ), COUNT( DISTINCT операнд ) и AVG( DISTINCT операнд ).

3.3. Соединения и объединения


CDS-определения могут содержать соединения (джойны) внутренние,
левые и правые внешние. Для получения декартова произведения таблиц
можно использовать их перекрестное соединение. Также можно
использовать объединения UNION и UNION ALL.

9
В то время, как в Словаре Данных нельзя создать ракурс базы данных,
использующий результаты других ракурсов, в CDS аналогичная вещь
вполне возможна: можно определить такие CDS view, источником данных
для которых будут другие CDS view.

4. Дальше — больше
4.1. Передача параметров
На уровне базы данных можно оперировать со значениями, полученными
с сервера приложений, например производить вычисления. Для этого
можно создать CDS view с параметрами. Передавать значения
параметрам CDS view можно из ABAP программы, для этого в
командe SELECT во фразе WHERE следует указать значения,
передаваемые соответствующим параметрам. Аналогично (с точностью
до синтаксических отличий) можно передавать параметры из одного CDS
view в другое. Параметры могут быть только скалярными; структуры и
таблиц в качестве параметров недопустимы.

4.2. Ассоциации
При определении CDS view можно установить ассоциации между
источниками данных. В принципе результат ассоциации логически
подобен соединению (если специально не указано иное, то именно
левому внешнему соединению), но представляет более компактную
форму записи или, если угодно, ассоциация это «ленивое» соединение, а
в случае открытой ассоциации (об этом чуть дальше) это - ассоциация по
запросу. Ассоциации можно, но не обязательно, присвоить псевдоним, это
бывает удобно, если имена источников длинны и/или непонятны. При
ассоциациях можно в квадратных скобках указать кардинальность
(например, [*], [1], [0..1], [1..n]); кардинальность может быть полезна как
элемент смыслового описания. В частности, предупреждения в редакторе
CDS могут зависеть от выбранной кардинальности.
Открытые ассоциации не содержат полей ассоциируемых источников и
потому не участвуют в соответствующих SQL-операторах CREATE VIEW и
10
не видны при предъявлении результатов, например, по кнопке F8 или в
транзакции SE11. Зато в запросах из ABAP можно указать любые поля из
открытых ассоциаций, надо только перед именем этих полей указать
путевое выражение, в итоге обращение к полю ассоциированного
источника будет иметь формат \ассоциация-поле. В запросе к базе
данных появятся соответствующие соединения и затребованные поля,
что можно увидеть при SQL-трассировке в транзакции ST05.

При указании полей в ассоциациях можно указать условия фильтрации.


Поясним это на простом примере. Допустим нас интересует перевод
названий активностей (тексты активностей содержатся в таблице TACTT)
с английского языка на русский. Что-то вроде этого:

Нужный результат можно получить с помощью CDS view

define view ZQK1_B as


select distinct from tactt
association[*] to tactt as _t
on tactt.actvt = _t.actvt
{ actvt
, _t[spras = 'E'].ltext as e
, _t[spras = 'R'].ltext as r
} where actvt < '04'

Это заметно проще, чем соответствующее соединение:

CREATE VIEW "ZQK1_A" AS SELECT


DISTINCT "TACTT"."ACTVT",
"=A0"."LTEXT" AS "E",
"=A1"."LTEXT" AS "R"
11
FROM (
"TACTT" "TACTT" LEFT OUTER MANY TO MANY JOIN "TACTT" "=A0" ON
(
"TACTT"."ACTVT" = "=A0"."ACTVT" AND
"=A0"."SPRAS" = N'E'
)
) LEFT OUTER MANY TO MANY JOIN "TACTT" "=A1" ON (
"TACTT"."ACTVT" = "=A1"."ACTVT" AND
"=A1"."SPRAS" = N'R'
)
WHERE "TACTT"."ACTVT" < N'04'
В общем, (как сказано в https://sapyard.com/cds-part-15-associations-in-
cds-views-i/) ассоциация это - «ленивое» соединение.

4.3. Расширения
Свой собственный CDS view можно изменить. А вот те CDS view, которые
создал другой производитель, например, SAP или третья фирма, просто
так не изменишь, потому что от поставщика может прийти новая версия, и
тогда, если вы его изменяли, то все ваши изменения погибнут. Поэтому
для CDS view, как и для многих других типов объектов разработки
предусмотрена возможность расширения. Расширение это создание
своих объектов разработки в своем диапазоне имен; эти расширения
соотнесены с расширяемым объектом. Когда (и если) от поставщика
придет новая версия объекта разработки, к ней будет применено то, что
указано в расширении.

Расширить существующий (чужой) CDS view можно, создав расширение.


Выглядит это так:

extend view расширяемый_CDS_view


with ваш_расширяющий_CDS_view
association to ваш_источник

12
on условия
{ новые_поля
}...

4.4. Фильтрация по полномочиям


Выше уже было отмечено, что в ABAP-программах традиционно проверка
полномочий перенесена на уровень приложения, что дает возможность
программировать различные сценарии реакции на отсутствие
полномочий, но за эту возможность приходится платить
производительностью (а при неаккуратном администрировании,
например, при отладке в продуктиве еще и появляется угроза нарушения
конфиденциальности данных). Хочется иметь возможность вообще не
передавать запрещенные данные на сервер приложений. Такую
возможность дают CDS роли.

Так CDS view:

define view ZQK1_B as


select from tactt
{ actvt
, ltext
} where spras = 'E' and actvt < '05'

дает результат:

Если же определить и активировать CDS роль:

define role Zqk_dcl1 {


grant select on ZQK1_B

13
where actvt < '03';
}

Этот же CDS view будет выдавать:

CDS роли не создаются на уровне базы данных. Просто интерфейс базы


данных добавляет к запросам дополнительные условия фильтрации,
взятые из такой роли. Поэтому появляется возможность использовать
SAP-профили полномочий о которых, понятное дело, система управления
базой данных ничего не знает.

5. Табличные функции. Только для SAP


HANA
Начиная с версии 7.4 в ABAP можно создать классы, методы которых
будут содержать текст написанный не на языке ABAP, а на родном языке
базы данных. В настоящее время эта возможность есть только для базы
данных SAP HANA для ее языков SQL Script и L. В частности такие методы
могут определять хранимые процедуры базы данных. Эта возможность
рассматривается в семинаре HA400. ABAP-программирование в SAP
HANA . Подробнее об этом семинаре я написал в упомянутой ранее
статье ABAP для HANA (HA400).

Кроме того, что такие методы могут определять хранимые процедуры, они
могут также определять табличные функции, для чего в определении
метода следует написать:

METHODS имя_метода FOR TABLE FUNCTION имя_функции

14
В имплементации метода для табличной функции используется
конструкция:

method имя_метода
BY DATABASE FUNCTION
FOR HDB LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING источник
.

Ну и, конечно же, нужно определить CDS табличную функцию. Например,


так:

define table function ZQK_TF


returns
{ поле_1
; поле_2...
} implemented by method имя_класса=>имя_метода;

Может возникнуть вопрос, а зачем такие сложности, тем более что это все
работает только с одной базой данных, то есть теряется платформенная
независимость. Вот как раз ради того, чтобы воспользоваться приятными
особенностями этой конкретной базы данных. Например, SAP HANA
предоставляет не пять, а двадцать две агрегатные функции, языковый и
нестрогий текстовые поиски и другие дополнительные возможности.

6. Использование CDS view


Из CDS view можно получать данные с помощью ABAP-команды SELECT,
как из обычной прозрачной таблицы.
Весьма приятно использование CDS view в качестве источника данных в
классе интегрированного доступа к данным CL_SALV_GUI_TABLE_IDA.
Этот класс позволяет визуализировать табличные данные,
непосредственно из источника, без необходимости полномасштабной
15
обработки данных на уровне ABAP-программы. Кроме того, для CDS view
можно создать свой особенный CDS профиль, не затрагивая остальные –
быть может, различные – дисциплины обеспечения конфиденциальности.

CDS view можно использовать как прокси-объект для прозрачной


таблицы. Если у Вас есть доступ к S/4HANA, попробуйте сделать
SQL-трассировку обращения к таблице MSEG.

Можно создать OData-сервис для получения данных из CDS view. Для


этого достаточно добавить в определение CDS одну
аннотацию @OData.publish: true. А дальше можете опубликовать и
протестировать полученный OData-сервис с помощью транзакции
/IWFND/MAINT_SERVICE. Подробнее об OData-сервисах, их разработке и
администрировании можно узнать на семинаре GW100. SAP Gateway.
Создание OData сервисов.

Кроме того можно использовать CDS view как источники данных для SAP
Fiori.

7. Заключение
Мы кратко рассмотрели содержание семинара S4D430. Создание
ракурсов Core Data Services ABAP (CDS ABAP). Семинар продолжается
3 дня, включает 16 упражнений. CDS табличные функции доступны только
при использовании базы данных SAP HANA, остальные возможности
доступны в SAP NetWeaver версии 7.4 независимо от платформы.
Семинар необходим ABAP-разработчикам, консультантам в области
разработки на ABAP и руководителям разработок, нужен специалистам
по поддержке и консультантам в прикладной области для разумной
постановки заданий на разработку.
Для того, чтобы от данного семинара был толк, непременно необходимо
обладать знаниями, излагаемыми на семинарах BC400.Введение в
инструментальные средства ABAP (подробнее) или S4D400 -

16
Introduction to ABAP Programming for SAP S/4HANA и полезно
знать BC430.Словарь-справочник (подробнее).

Официальная документация по ABAP CDS доступна в транзакции


ABAPDOCU (путь: ABAP-Dictionary → ABAP CDS in ABAP Dictionary) и на
SAP Help Portal по линку:

https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abencds.htm.

17

Вам также может понравиться