Создание oData сервиса. Часть 2. Function import

Function import - Операция выполняемая на стороне бэкенд системы. Это некоторая альтернатива обычным CRUD сервисам для случаев не подходящих под GET, POST, PUT, DELETE запросы. Может быть вызвана GET и POST методами. Например, проверки, запуски каких либо операций и прочее.

Пример создания

Для сервиса созданного в прошлой части создадим Function import по проверке наличия записи в таблице. (Максимально примитивная функция, в реальных задачах будете вызывать что-то реально стоящее))

Новая функция будет получать на вход ключ записи в таблице
SPFLI и возвращать информацию о ее наличии\отсутствии.
Первым делом следует создать выходную сущность:

В прошлый раз мы создавали сущность на основе данных из ABAP словаря. В этот раз для разнообразия создадим свойства вручную.

Создание функции

Первая функция будет использовать метод GET и возвращать только одну запись

Далее указываем входные параметры функции (Function Import Parameters). Точно таким же способом как и для сущности.
Выходные параметры имеют три варианта:
Без выходных параметров - тут, думаю, все ясно.
Entity type - можно использовать обычные entity или EntitySet в зависимости от кардинальности.
Complex Type - Это отдельная сущность, пример с которой будет рассмотрен ниже.

Сохраняем и перегенерируем сервис. Не забываем делать данную операцию при любых изменениях сервиса. Также необходимо обновить метаданные и сбросить кэш у сервиса.

Для обработки вызова необходимо переопределить метод EXECUTE~ACTION класса DPC_EXT

Тест осуществляется в транзакции /IWFND/GW_CLIENT
Строка для запуска sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/runFunctionCheckPost?Connid='0017'&Carrid='AA'
Результат:

Далее сделаем POST функцию для того же самого действия. Собственно ничем не будет отличаться, кроме метода вызова.

В коде укажем, что новая функция должна идти по той же ветке, что и прошлая(Напоминаю, это чтобы сильно не мудрить с кучей кода)

Параметры при запуске передаем точно так же.
sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/runFunctionCheckPost?Connid='0017'&Carrid='AA'

Третий ФМ будет немного отличаться. На вход подаем поле Carrid а на выходе хотим получить список значений из таблицы с этим полем. При При этом нам надо задать кардинальность 0..n или 1..n. И, что казалось бы логичным установить выходные параметры как EntitySet.
Что-то вроде этого:

Однако, при попытке вызова ФМ получим 405 ошибку: The specified HTTP method is not allowed for the resource identified by the Data Service Request URI

Это можно обойти указав тип выходного параметра как Complex Type

Создание Complex Type:

Добавляем выходные поля. Хватит и двух для примера.

Указываем этот тип в настройке новой функции:

Реализуем ветку для сбора данных в методе EXECUTE_ACTION

 

Добавить комментарий

Ваш адрес email не будет опубликован.