В предыдущих частях(три, четыре) было рассмотрено получение зависимых данных из системы SAP. В данной части получим данные из внешнего источника в систему. Для для этого будем использовать метод CREATE_DEEP_ENTITY.
Получать будем туже самую структуру, что отправляли в предыдущем посте.
Первым делом в классе необходимо модифицировать класс *MPC_EXT.
Создадим тип данных который мы хоти получать.
1 2 3 4 5 6 7 |
" "entitysflightset и entitysbookset Имена Navigation Properties соответствующих сущностей TYPES: BEGIN OF ts_deep_spfli. INCLUDE TYPE zcl_zz_test_service_mpc=>ts_entityspfli. TYPES: entitysflightset TYPE STANDARD TABLE OF zcl_zz_test_service_mpc=>ts_entitysflight WITH DEFAULT KEY, entitysbookset TYPE STANDARD TABLE OF zcl_zz_test_service_mpc=>ts_entitysbook WITH DEFAULT KEY, END OF ts_deep_spfli. |
После этого в методе DEFINE для сущности прописать новый тип. Вот такой код требуется:
1 2 3 4 5 |
METHOD define. super->define( ). DATA(lo_entity_type) = model->get_entity_type( iv_entity_name = 'EntitySpfli' ). lo_entity_type->bind_structure( iv_structure_name = 'ZCL_ZZ_TEST_SERVICE_MPC_EXT=>TS_DEEP_SPFLI' ). ENDMETHOD. |
Переходим в класс *DPC_EXT и переопределяем метод /iwbep/if_mgw_appl_srv_runtime~create_deep_entity
В нем определяем необходимые код
Строка для запуска теста: /sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/EntitySpfliSet
Отправка происходит методом POST все остальные данные прописываем в теле. В зависимости от входной структуры система автоматически выберет, что ей вызвать. Обычный CREATE_ENTITY, если передали плоскую структуру
Пример:
Хотя метод POST служит в первую очередь для создания записей, при вызове метода CREATE_DEEP_ENTITY можно возвращать данные. Но есть один тонкий момент связанный с вложенными структурами. Чтобы можно было вернуть данные во вложенной таблице, надо чтобы изначально при вызове метода, была передана хотя бы пустая таблица
Определим метод CREATE_DEEP_ENTITY следующим образом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity. DATA lr_deep_entity TYPE ZCL_ZZ_TEST_SERVICE_mpc_ext=>ts_deep_spfli. io_data_provider->read_entry_data( IMPORTING es_data = lr_deep_entity ). "Внимание. данный пример для того, чтобы показать разницу в выходных данных "Создание чего либо, что подразумевает метод POST опустим SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE lr_deep_entity-entitysflightset WHERE carrid = lr_deep_entity-carrid AND connid = lr_deep_entity-connid. SELECT carrid connid FROM sbook INTO CORRESPONDING FIELDS OF TABLE lr_deep_entity-entitysbookset WHERE carrid = lr_deep_entity-carrid AND connid = lr_deep_entity-connid. copy_data_to_ref( EXPORTING is_data = lr_deep_entity CHANGING cr_data = er_deep_entity ). ENDMETHOD. |
Здесь при выполнении запроса не подали таблицу EntitySbokSet и хотя мы ее заполнили во время выполнения метода. В выходных данных ее не будет.
Во-втором случае, подадим ее с пустым значением. В результате выходные данные заполнены