Внедрение Association и Navigation в SAP oData сервис
Ассоциирование и Навигация – это два важных свойства, доступных в SAP Netweaver Gateway для связывания двух типов сущностей.
Ассоциация устанавливает отношения между значениями в ключевых полях в обеих структурах типов сущностей. Ассоциация назначает связи между сущностями и может иметь различную множественность (один ко многим, многие ко многим, один к одному).
Навигация создается в основном типе сущности при создании ассоциации. Свойства навигации описывают путь между связанными объектами, предоставляет ссылку от основного объекта к связанным объектам.
Должны быть переопределены методы чтения для GET_ENTITYSET и GET_ENTITY для всех сущностей oData сервиса. Пусть даже с пустой логикой выбора данных.
Рассмотрим структуру oData сервиса в нашем примере. Наборы сущностей:
1. GroupSet – группа программ бюджета. Ключевое поле GroupId.
2. ProgramSet – программы бюджета. Ключевые поля GroupId, ProgramId.
3. EventsSet – мероприятия программы бюджета. Ключевые поля GroupId, ProgramId, Funcarea.
Создаем ассоциации – связываем наши внутренние таблицы по ключевым полям:
1. GroupSet <-> ProgramSet: ассоциация один ко многим.
2. ProgramSet <-> EventsSet: ассоциация один ко многим.
Создаем навигации:
1. GroupProgram – навигация к программам бюджета по коду группы программ.
Синтаксис:
- /sap/opu/odata/sap/ZCO_BUDGETFS1_SRV/GroupSet('100')/GroupProgram
2. ProgramEvent – навигация к мероприятиям по коду программы.
Синтаксис:
- /sap/opu/odata/sap/ZCO_BUDGETFS1_SRV/ ProgramSet(GroupId='100',ProgramId='01')/ProgramEvent
В Back-End системе, в транзакции SEGW создадим ассоциацию. При создании ассоциации метод навигации также сгенерируется.
Правой кнопкой мыши кликаем на Association (1), выбираем пункт Create (2). Заполняем поля в диалоговом окне (3) и нажимаем кнопку Next (4).
В следующем шаге визарда указываем ключевое поле (1) для связи двух внутренних таблиц. Нажимаем на Next (2).
В следующем шаге ничего не меняем, нажимаем на Finish.
Мы создали ассоциацию между двумя типами сущностей и сгенерировали навигацию между внутренними таблицами. Не забудем сгенерировать сервис oData для принятия изменении.
Запустим транзакцию /IWFND/GW_CLIENT в фронтэнд системе. Посмотрим данные для
- /sap/opu/odata/sap/ZCO_BUDGETFS1_SRV/GroupSet('100')
В ответе сервиса увидим, что появилась навигация. По ссылке GroupSet(‘100’)/GroupProgram вернется внутренняя таблица ProgramSet отфильтрованная по ключу GroupId=’100’.
Успешный, пустой ответ сервиса. Остается добавить логику выбора данных в метод PROGRAMSET_GET_ENTITYSET. Например, такой:
- data: ls_key_tab LIKE LINE OF it_key_tab,
- lv_fs type SETID.
- *Если есть ключи выбора во внутреннюю таблицу, то считываем их для фильтрации данных
- read table it_key_tab with key name = 'GroupId' into ls_key_tab.
- lv_fs = ls_key_tab-value.
- if lv_fs is not initial.
- select GroupId ProgramId ProgramName Tval01 Tval02 Tval03 from zfmbl
- into corresponding fields of table et_entityset
- where Groupid = lv_fs.
- else.
- select GroupId ProgramId ProgramName Tval01 Tval02 Tval03 from zfmbl
- into corresponding fields of table et_entityset.
- endif.
- …
Сгенерируем сервис и запустим транзакцию /IWFND/GW_CLIENT в фронтэнд системе. Посмотрим данные для URI в формате json
- /sap/opu/odata/sap/ZCO_BUDGETFS1_SRV/GroupSet('100')/GroupProgram ?$format=json
Сервис успешно предоставил данные из внутренней таблицы ProgramSet по ключу GroupId = ‘100’.
Возникли проблемы с пониманием OData или SAP Netweaver Gateway? Хотите поделиться любыми вопросами по реальным проектам или решениям? Пожалуйста, не стесняйтесь. Оставьте свои сообщения в разделе комментариев.
Предыдущий шаг: Методы исполнения oData сервиса | Service Implementation CRUD
Создание SAP Gateway oData Service (SEGW):
Шаг №1. Определение модели данных. Entity Type. Entity Sets.
Шаг №2. oData: структура типов сущностей на основе ABAP структур (DDIC Structure)
Шаг №3. Внедрение / регистрация сервиса SAP Gateway oData servise ( SEGW)
Шаг №4. Методы исполнения oData сервиса | Service Implementation CRUD
Шаг №5. Внедрение Association и Navigation в SAP oData сервис
Расскажите по подробее отличие методов deep от $ batch
Спасибо большое за материал! Очень помогло для входа в тему.
Много текста и картинок – мало информации. Вместо того, чтобы дать объяснения по сути (например, что такое Data provider и Model provider, зачем нужны и чем отличаются; зачем генерируется базовый и класс-наследник) привели пошаговую инструкцию для “обезьянок”, после которой понимания не появляется. Даже в реализации GET методов захардкодили какую-то ерунду, пояснений к параметрам метода не дали. Нужно продолжение!