Создание oData сервиса. Часть 4. oData expand entity отправка данных

В прошлом посте было рассказано об ассоциации и навигации. В результате получили несколько вызовов сущностей, происходящих друг за другом. Однако, данный способ накладывает некоторые ограничения и потенциальные потери производительности, т.к. вместо одного RFC вызывается целая цепочка. Также часто нужно данные для передачи на фронт мы получаем одновременно, например как результат работы ФМ. Конечно, можно положить эти данные в буфер и брать необходимое во время вызова соответствующей сущности, звучит не очень рационально.
Стандартный интерфейс позволяет сделать так, чтобы все зависимые сущности заполнялись одновременно.

Не могу придумать какой-то более менее вменяемы пример, поэтому все будет максимально упрощенно.
Допустим необходимо по ключу получить запись таблицы SPFLI и зависимых ей SFLIGHT и SBOOK

Первым делом создадим таблицу сущность SBOOK аналогично созданной ранее SFLIGHT

И связь с сущностью EntitySpfli

Вот какие навигации у нас теперь есть от EntitySpfli

Далее в классе *DPC_EXT необходимо переопределить соответствующий метод GET_EXPANDED_ENTITY или GET_EXPANDED_ENTITYSET. Как определить какой метод нам нужен? Очень просто, все зависит от кардинальности нашей самой первой сущности. В данном примере это 0..1 значит и метод вызовется
GET_EXPANDED_ENTITY.

Обратите внимание, что методы GET_EXPANDED_ENTITY и GET_EXPANDED_ENTITYSET определяются один раз. Т.е. после их определения все вызовы expand будут происходить именно через эти методы, а не вызов отдельных GET_ENTITY или GET_ENTITYSET для соответствующей сущности. Этот момент надо предусмотреть в коде и при необходимости вызвать отдельный метод вручную.

Примечание:
1. Структура для результата должна точно соответствовать типам сущностей и их кардинальности. Если мы вызываем GET_EXPANDED_ENTITYSET то соответственно выходной будет уже таблица, а не структура. 
2. Необходимо заполнять выходную таблицу et_expanded_tech_clauses наименованиями обработанных сущностей. Иначе expand будет вызван еще и еще.

Строка вызова:
/sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/EntitySpfliSet(Mandt='',Carrid='AA',Connid='0017')?$expand=EntitySflightSet,EntitySbookSet&$format=json

В результате получили все связанные данные в одном вызове

 

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

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