Данная статья является частью вебинара 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).
Для примера будет использовать следующие таблицы
Создание ODATA-сервиса на основе CDS
Создадим простую CDS на основе таблиц ZTWA001_VARID + ZTWA001_VARVAL.
Для этого в Eclipse выберем Repository Object.
Затем выберем объект Data Definition
Укажем имя.
ZVWA003_VARHCDS / CDS fro VarH
Выберем 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
Для поиска в имени указываем имя CDS – система покажет сервис. Выделяем запись и нажимаем Add Selected Services.
Указываем пакет и подтверждаем создание
В случае успешного создания – можем просмотреть протестировать через /IWFND/GW_CLIENT - SAP Gateway Client.
Имя сервиса = имени CDS.
GET/sap/opu/odata/SAP/zvwa003_varhcds_cds/$metadata
Чтобы извлечь данные в качестве сущности Set нужно также указать имя CDS
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.
В открывшемся окне укажем CDS. В нашем случае я укажу CDS, созданную выше, т.е. ZVWA003_VARHCDS. Нажимаем Next.
Система создала дополнительную сущность в сервисе (в папке Data Source References), а также EntitySet.
После этого нажимаем Enter на новой Entity Types и EntitySet, а затем генерим сервис и тестируем, например, через транзакцию /IWFND/GW_CLIENT - SAP Gateway Client.
EntitySet для тестирования берем, как сгенерировала система
Путь для тестирования
GET: /sap/opu/odata/sap/ZWEB_ABAP_DEMO3_SRV/ZVWA003_VARHCDS?$top=2
Видим, что сервис отрабатывает без дополнительного изменения класса *DPC или *DPC_EXT. Если мы зайдем в соответствующие методы класса, то увидим, чтобы выборка делается через специальный класс.
Кроме того, у нас готовы, по сути, методы 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.
В открывшемся окне указываем нужную CDS и далее, как при добавлении 1ой сущности на основе CDS.
Затем: проверяем, генерируем и тестируем сервис.
Путь для тестирования в транзакции.
GET: /sap/opu/odata/sap/ZWEB_ABAP_DEMO3_SRV/ZVWA003_VARHCDS3?$top=5
Telegram-канал/чат: https://t.me/ABAPclub