Меню

Реализация OData_v2-сервиса в ABAP через композицию

В предыдущей главе мы реализовали базовые операции в OData-сервисе без каких-либо архитектурных паттернов. Однако, при решении практических задач это может быть не слишком удобно и может усложнить поддержку и расширение проекта. Поэтому «мой» подход к разработке OData-сервисам – это разработка с помощью композиции: то есть, когда в классе *MPC бизнес-логики нет вообще, а вместо этого вызывается нужный класс для сущности.

Часть 3

Содержание

Что такое композиция и зачем она нужна?

ABAP-реализация OData_v2-операций через ООП-композицию

Обработка исключений

Массовое создание и обновление сущности (batch-request) (дополнение к CUD)

Реализация множественного обновления с переопределением /IWBEP/IF_MGW_APPL_SRV_RUNTIME~CHANGESET_PROCESS

Реализация 2-ой сущности на основе композиции на основе созданных классов

Batch-запрос на head+item

Настройка параллельности при обработке batch-request

Реализация QUERY-options для GET_ENTITY_SET

Реализация Function Imports

Реализация Navigation Properties для Expand and Deep Insert

Для начала вспомним, что такое композиция и в чем ее преимущества, а также, что говорит на этот счет SAP; затем на этой основе реализуем 3 сущности: Variable ID, Variable Value и Variable Change Log.

Что такое композиция и зачем она нужна?

Композиция – это отношение между объектами (связь между объектами) «часть-целое». Особенность в том, что объект существует только как часть основного объекта.

В нашем случае из преимуществ композиции: расширяемость/масштабируемость и тестируемость.

Чтобы лучше понять определение рассмотрим другие виды связей между объектами.

Рис. 1 Пример связей между объектами на языке UML (http://www.uml.org)

Поясним эту UML-диаграмму. В верхнем блоке (жирный шрифт) обозначается название класса или интерфейса. Если класс абстрактный, то обозначается курсивом; для пометки интерфейса – лучше вносить слово <<interface>>. В блоке посередине обозначаются атрибуты класса/интерфейса. Значки в начале обозначают область видимости.

Символ «+»  обозначает Public (видимый).
Символ «#» (октоторп / решетка)  обозначает Protected (Защищенный).
Символ «-»  обозначает Private (скрытые).

Затем обозначается имя атрибута и через двоеточие его тип.

Взаимосвязи между объектами

1. Зависимость

Изменение класса (без стрелочки) может повлиять на класс со стрелочкой.
Изменение класса CL_GUI_ALV_GRID может повлиять на изменение на нашей программы ALV-отчета; но наоборот – нет.

Символ:

2. Ассоциация

Связь между объектами модели, которая описывает набор связей, существующих между объектами. Ассоциация показывает, что объекты одной сущности связаны с объектами другой сущности.
[наша выборка данных]  и [alv-представление]

Символ:

3. Агрегация

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

Отношение контейнер и содержимое. По сути – коллекция других объектов.
Пример: списки. Список настроек, разработок, контактов.
Если список удалить, то сами объекты настроек, разработок, контактов (люди) – останутся.

Символ:

4. Композиция (вот что нам нужно в ABAP) – более строгий вариант агрегации. Форма агрегации с четко выраженным отношением владения и совпадением времени жизни частей и целого. Если контейнер будет удален и то и объекты в нем будут удалены.

Символ:

 

Обозначает отношение композиции. То есть атрибут в одном классе имеет другой тип, и линия ведет к этому типу.

5. Обобщение / Наследование (Generalization) – показывает отношение, при котором потомок строится по спецификации обобщенного элемента (родителя).

Символ:

6. Реализация – это отношение между элементами модели, в котором один элемент (клиента) реализует поведение, заданное другим (поставщиком).  Реализация – это отношение часть-целое.
Поставщик, как правило, является абстрактным классом или интерфейсом.

Символ:

Также в UML могут использоваться Заметки (Notes).

В ООП-паттернах, рекомендацией является использование композиции вместо наследования.

ABAP-реализация OData_v2-операций через ООП-композицию

Реализуем OData сервис, но уже немного с другим подходом, а также с массовыми операциями.

Для 1-ой сущности – создадим структуру ZSWA003_VAR_H2_SRV на основе таблицы ZTWA001_VARID.

Идем в транзакцию SEGW и создаем проект ZWEB_ABAP_DEMO3.

Выбираем Import -> DDIC Structure:

Укажем имя сущности VarH и ссылку на структуру:

Добавим все поля как есть и нажмем Next:

Обозначим поле Namе в качестве ключевого поля. Описание в столбцах Name и Label оставим как есть. По завершению нажимаем Finish.

По итогу система создаст проект с сущностью:

Затем сгенерируем сервис (на данном шаге в первый раз) и тем самым создадим нужные классы.

Подтверждаем классы и тем самым создаем их (указываем запрос, если нужно).

После начальной генерации сервиса – зарегистрируем его через транзакцию /IWFND/MAINT_SERVICE - Activate and Maintain Services.

На экране заполняем поля (как на скрине) и нажимаем Get Services.

Выделяем нужный сервис и нажимаем Add Selected Services.

Система предложит имя сервиса; делаем подтверждение ввода, обращая внимание на пакет.

После указания запроса должно появиться сообщение, как ниже:

Возвращаемся в транзакцию SEGW в созданный проект и идем в класс ZCL_ZWEB_ABAP_DEMO3_DPC_EXT.

Правой кнопкой мыши щелкаем по ID класса и выбираем Go to ABAP WorkBench.

Реализовываем метод конструктор:

Код метода CONSTRUCTOR:

 method CONSTRUCTOR.
    super->constructor( ).
  endmethod.

Также переопределяем метод VARHSET_GET_ENTITYSET.

В методе пишем код (временный) для проверки работоспособности сервиса как такового.

После вставки кода и активации, переходим в транзакцию /IWFND/GW_CLIENT - SAP Gateway Client. И проверяем service document, service metadata и GetEntitySet.

Все успешно работает. Теперь перейдем в Eclipse и преобразуем код, чтобы сама выборка происходила в отдельном классе.

По факту мы хотим реализовать следующую схему.

Рис. 2 UML-схема для OData_in-параметра

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти