В предыдущих частях(раз, два) был создан сервис. При помощи него мы можем получить запись по ключу или набор записей фильтру. В реальной жизни чаще приходится работать с более сложными структурами. Ассоциации - позволяют указать отношения между ключами таблиц. Кардинальность показывает как таблицы относятся одна к другой
Например, то, что касается таблиц SPFLI и SFLIGHT Если у нас есть кодами рейсов и их расписанием. Мы можем по ключу получить или не получить код рейса, и расписание к нему из нескольких записей
Создадим новую ассоциацию
Укажем кардинальность. От этого будут зависеть вызываемые методы класса DPC_EXT
Указываем ключевые поля
После вызова согласно указанной кардинальности "1" для SPFLI и "n" для SPFLIGHT произойдет вызов методов *GET_ENTYTY и *GET_ENTITYSET, соответственно. В ответе получим данные по обоим сущностям.
/sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/EntitySpfliSet(Mandt='100',Carrid='AA',Connid='0017')?$expand=EntitySflightSet&$format=json
После "expand" указываем имя из Navigation Properties
Чуть чуть изменим код, т.к. в текущем случае мы будем получать на вход ключ, а не фильтр. Запись SPFLI мы берем по ключу, а записи SPFLIGHT зависят от нее по нему же.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
METHOD entitysflightset_get_entityset. IF NOT line_exists( it_navigation_path[ nav_prop = 'EntitySflightSet' ] ). DATA(lr_mandt) = VALUE #( it_filter_select_options[ property = 'Mandt' ]-select_options OPTIONAL ). DATA(lr_carrid) = VALUE #( it_filter_select_options[ property = 'Carrid' ]-select_options OPTIONAL ). DATA(lr_connid) = VALUE #( it_filter_select_options[ property = 'Connid' ]-select_options OPTIONAL ). ELSE. APPEND VALUE #( sign = 'I' option = 'EQ' low = it_key_tab[ name = 'Carrid' ]-value ) TO lr_carrid. APPEND VALUE #( sign = 'I' option = 'EQ' low = it_key_tab[ name = 'Connid' ]-value ) TO lr_connid. ENDIF. SELECT * FROM sflight INTO TABLE et_entityset WHERE carrid IN lr_carrid AND connid IN lr_connid. ENDMETHOD. |
Также мы можем получить зависимый объект по навигации. При этом вызова корневой сущности происходить не будет. Только конечная. Разница в синтаксисе в том, что Свойство навигации отделяется "/". Можно задавать целый цепочки таких связей.
Пример вызова:
/sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/EntitySpfliSet(Mandt='100',Carrid='AA',Connid='0017')/EntitySflightSet&$format=json
Т.е. в данном случае сущность *GET_ENTITY для SPFLI вызвана не будет, только *GET_ENTITYSET для SFLIGHT