Найти в Дзене
rustabapclub

OData v2: использование CDS для создания сервиса и для создания сущности в сервисе

Оглавление

Данная статья является частью вебинара WebABAP: разработка OData-сервисов в среде SAP NetWeaver. Базовый курс опубликован по ссылке https://sappro.sapland.ru/author-column/20772 , а материалы курса (и ссылки на вспомогательные материалы) доступны на github-репозитарии: https://github.com/OlegBash599/WebABAP_samples. Сам курс основывается на мини-модели extended TVARV-like model: несколько таблиц, чьё назначение вести переменные значения, диапазоны, переключатели, пояснения и документации к важным переменным в системе (например, набор видов сбытовых заказов, для которых при сохранении нужно отправлять сообщение в telegram). Как правило, подобный TVARV-контейнер есть на любом проекте в том или ином виде.

CDS – это довольно новый объект в среде SAP-разработки. Но в OData-сервисы он очень хорошо вписывается. На основе CDS можно создавать как отдельный OData-сервис, так и сущность уже имеющегося OData-сервиса. В этой статье рассматриваются две эти возможности.

Для целей демонстрации я буду использовать модель данных таблиц твердо-изменяемых данных (TVARV-подобных) (extended TVARV-like model).

Для примера будет использовать следующие таблицы

Демо-таблица: ZTWA001_VARID
Демо-таблица: ZTWA001_VARID
Структура таблицы ZTWA001_VARVAL
Структура таблицы ZTWA001_VARVAL

Создание ODATA-сервиса на основе CDS

Создадим простую CDS на основе таблиц ZTWA001_VARID + ZTWA001_VARVAL.

Для этого в Eclipse выберем Repository Object.

Рис. 1  Выбираем пакет (в моем случае ZWA003)  -> New -> Other ABAP Repository Object
Рис. 1 Выбираем пакет (в моем случае ZWA003) -> New -> Other ABAP Repository Object

Затем выберем объект Data Definition

Рис. 2 Выбираем Data Definition
Рис. 2 Выбираем Data Definition

Укажем имя.

ZVWA003_VARHCDS / CDS fro VarH

Рис. 3 Указываем имя CDS
Рис. 3 Указываем имя CDS

Выберем template CDS in Join

Рис. 4 Выбираем template CDS in Join
Рис. 4 Выбираем template CDS in Join

Система предоставит шаблон для создания CDS.

@AbapCatalog.sqlViewName: 'ZVWA003_VARH'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS fro VarH'
@OData.publish: true
define view ZVWA003_VARHCDS
as select from ztwa001_varid as h
left outer join ztwa001_varval as i on h.var_name = i.var_name
{
key
h.var_name as VAR_NAME,
h.var_desc as VAR_DESC,
h.var_type as VAR_TYPE,
h.is_del as IS_DEL,
h.is_debug_on as IS_DEBUG_ON,
h.fast_val as FAST_VAL,
h.cru as CRU,
h.crd as crd,
h.crt as crt,
h.chu as chu,
h.chd as chd,
h.cht as cht,
count(*)
as NUM_OF_VALUES
} group by h.var_name, h.var_desc, h.var_type,
h.is_del, h.is_debug_on, h.fast_val,
h.cru, h.crd, h.crt, h.chu, h.chd, h.cht

Обратим внимание, что в CDS используется агрегированная функция COUNT. Добавим @OData.publish: true для возможности публикации сервиса.

После того, как мы активировали CDS с аннотацией @OData.publish: true за кадром создался незарегистрированный сервис (ровно также как и в случае создания OData-сервиса через структуру). Нам нужно зайти в транзакцию /IWFND/MAINT_SERVICE - Activate and Maintain Services и зарегистрировать сервис.

Нажимаем кнопку Add Service

Рис. 5 Активируем сервис через Add Service
Рис. 5 Активируем сервис через Add Service

Для поиска в имени указываем имя CDS – система покажет сервис. Выделяем запись и нажимаем Add Selected Services.

Рис. 6 Выбираем нужный сервис для для дальнейшего добавления
Рис. 6 Выбираем нужный сервис для для дальнейшего добавления
Рис. 7 Добавляем сервис
Рис. 7 Добавляем сервис

Указываем пакет и подтверждаем создание

Рис. 8 Указываем пакет для генерации и сохранения сервиса (и связанных объектов)
Рис. 8 Указываем пакет для генерации и сохранения сервиса (и связанных объектов)

В случае успешного создания – можем просмотреть протестировать через /IWFND/GW_CLIENT - SAP Gateway Client.

Имя сервиса = имени CDS.

GET/sap/opu/odata/SAP/zvwa003_varhcds_cds/$metadata

Рис. 9 Сервис в тестовом инструменте SAP Gateway
Рис. 9 Сервис в тестовом инструменте SAP Gateway

Чтобы извлечь данные в качестве сущности Set нужно также указать имя CDS

Рис. 10 При запросе данных мы увидим имя сгенерированного Entity и можем его использовать для обращения к сущности
Рис. 10 При запросе данных мы увидим имя сгенерированного Entity и можем его использовать для обращения к сущности

GET /sap/opu/odata/SAP/zvwa003_varhcds_cds/ZVWA003_VARHCDS('ZDMS_N3')

Сервис также доступен для вызова из транзакции SICF (путь: sap-> opu -> odata -> sap).

Выборка из CDS будет предполагать все основные возможные опции OData: filter, select, skip, top. Создавая сервис таким способом, мы не можем редактировать данные и даже до-расширить сервис, чтобы данные можно было редактировать.

Создание ODATA-сущности для имеющегося OData-сервиса на основе CDS (SADL)

Этим способом к сервису можно подключить сущность, которая будет выбирать данные из CDS. Давайте посмотрим, как это можно сделать.

Для создания первой сущности: в режиме редактирования щелкаем правой кнопкой мыши по ветке «Data Model» и идем по пути Reference -> Data Source.

Рис. 11 Указываем Data Source в качестве ссылки для данных
Рис. 11 Указываем Data Source в качестве ссылки для данных

В открывшемся окне укажем CDS. В нашем случае я укажу CDS, созданную выше, т.е. ZVWA003_VARHCDS. Нажимаем Next.

Рис. 12 Указываем целевую CDS, которая ведет к данным
Рис. 12 Указываем целевую CDS, которая ведет к данным
Рис. 13 Да, всего лишь в 3 клика, а теперь Finish
Рис. 13 Да, всего лишь в 3 клика, а теперь Finish

Система создала дополнительную сущность в сервисе (в папке Data Source References), а также EntitySet.

Рис. 14 Убеждаемся, что новая сущность создана
Рис. 14 Убеждаемся, что новая сущность создана

После этого нажимаем Enter на новой Entity Types и EntitySet, а затем генерим сервис и тестируем, например, через транзакцию /IWFND/GW_CLIENT - SAP Gateway Client.

Рис. 15 Перегенерируем сервис полностью
Рис. 15 Перегенерируем сервис полностью

EntitySet для тестирования берем, как сгенерировала система

Рис. 16 В сервисе видим EntitySet с сгенерированным именем.
Рис. 16 В сервисе видим EntitySet с сгенерированным именем.

Путь для тестирования

GET: /sap/opu/odata/sap/ZWEB_ABAP_DEMO3_SRV/ZVWA003_VARHCDS?$top=2

Видим, что сервис отрабатывает без дополнительного изменения класса *DPC или *DPC_EXT. Если мы зайдем в соответствующие методы класса, то увидим, чтобы выборка делается через специальный класс.

Рис. 17 Сгенерированный код через SADL в OData-сервисе
Рис. 17 Сгенерированный код через SADL в OData-сервисе

Кроме того, у нас готовы, по сути, методы GET_ENTITYSET и GET_ENTITY и даже Create, Update, Delete. Однако, Create, Update, Delete придется переопределять, чтобы работа была корректная. Получается, что этот способ дает нам не только готовые методы выборки, но и возможность расширения методов Create, Update, Delete.

Добавим еще одну сущность (следующую сущность).

Переходим по пути в нашем сервисе Data Model -> Data Source References -> Exposures via SADL и дважды щелкаем по CDS-Entity Exposures и нажимаем кнопку Add CDS-Entity.

Рис. 18 Нажимаем Add CDS-Entity
Рис. 18 Нажимаем Add CDS-Entity

В открывшемся окне указываем нужную CDS и далее, как при добавлении 1ой сущности на основе CDS.

Рис. 19  Указываем имя CDS для новой сущности
Рис. 19 Указываем имя CDS для новой сущности

Затем: проверяем, генерируем и тестируем сервис.

Рис. 20 Убеждаемся, что сущность добавлена в сервис
Рис. 20 Убеждаемся, что сущность добавлена в сервис

Путь для тестирования в транзакции.

GET: /sap/opu/odata/sap/ZWEB_ABAP_DEMO3_SRV/ZVWA003_VARHCDS3?$top=5

Telegram-канал/чат: https://t.me/ABAPclub