Концепция немного похожа на концепцию статических функций в языках программирования.
Задача:
была реализована служба OData для создания транспортного запроса. Теперь выяснилось, что вызывающая система не может отправить http-запрос с полезной нагрузкой в теле. Поэтому необходим сервис, в котором передача параметров происходит полностью в URL. Это требование упрощается тем, что транспорт всегда создается только с одной позицией. Это означает, что в URL не нужно отображать массив с данными о позиции.
Описание задачи
Проект SEGW ZSD_TRANSPORT_ORDER должен быть расширен импортом функции под названием «CreateSinglePosTransport». Импорт функции должен ожидать следующих параметров импорта функции:
Lgnum (элемент данных LGNUM) Bwlvs (элемент данных BWART) NoSplit (элемент данных RL03ANOSPL) OnlyComplete (элемент данных FLAG) Сквита (элемент данных RL03TSQUIT) Нидру (элемент данных RL03ANIDRU) Matnr (элемент данных MATNR) Верки (элемент данных WERKS_D) Lgort (элемент данных LGORT_D) Anfme (элемент данных RL03TANFME) Altme (элемент данных LRMEI) Vltyp (элемент данных LTAP_VLTYP) Vlpla (элемент данных LTAP_VLPLA) Nltyp (элемент данных LTAP_NLTYP) Nlpla (элемент данных LTAP_NLPLA)
Не забудьте вручную выставить тип каждому параметру:
Функция импорта должна возвращать сложный тип «TransportOrder». Комплексный тип «TransportOrder» должен содержать только свойство «Tanum» (элемент данных TANUM). Пример импорта функции с возвратом сложного типа можно найти в проекте ZSD_SERIAL_MOVEMENT.
Для реализации импорта функции в классе ZCL_SD_TRANSPORT_ORDER_DPC_EXT должен быть переопределен метод /IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION. Пример реализации также можно найти в проекте ZSD_SERIAL_MOVEMENT. Затем функция import должна вызвать метод CREATE_TRANSPORT класса ZCL_SD_TRANSPORT_ORDER_DPC_EXT. В случае успеха, номер созданного транспортного запроса должен быть возвращен в TransportOrder-Tanum. В случае ошибки возвращается исключение, которое произошло. См. метод CREATE_DEEP_ENTITY.
*IV_ACTION_NAME TYPE STRING OPTIONAL Obsolete *IT_PARAMETER TYPE /IWBEP/T_MGW_NAME_VALUE_PAIR OPTIONAL Table of Strings Obsolete *IO_TECH_REQUEST_CONTEXT TYPE REF TO /IWBEP/IF_MGW_REQ_FUNC_IMPORT OPTIONAL *ER_DATA TYPE REF TO DATA */IWBEP/CX_MGW_BUSI_EXCEPTION business exception in mgw */IWBEP/CX_MGW_TECH_EXCEPTION mgw technical exception method /iwbep/if_mgw_appl_srv_runtime~execute_action. data: lr_message_cont type ref to /iwbep/if_message_container, ls_tr_head type zcl_sd_transport_order_mpc=>ts_transport, lt_tr_positions type zcl_sd_transport_order_mpc=>tt_transportposition, ls_tr_positions like line of lt_tr_positions. case iv_action_name. when 'CreateSinglePosTransport'. ls_tr_head-lgnum = value #( it_parameter[ name = 'Lgnum' ]-value optional ). ls_tr_head-data-bwlvs = value #( it_parameter[ name = 'Bwlvs' ]-value optional ). ls_tr_head-data-lgnum = value #( it_parameter[ name = 'Lgnum' ]-value optional ). ls_tr_head-data-nidru = value #( it_parameter[ name = 'Nidru' ]-value optional ). ls_tr_head-additionalcreationdata-kompl = value #( it_parameter[ name = 'OnlyComplete' ]-value optional ). ls_tr_head-additionalcreationdata-nospl = value #( it_parameter[ name = 'NoSplit' ]-value optional ). ls_tr_positions-additionalcreationdata-anfme = value #( it_parameter[ name = 'Anfme' ]-value optional ). ls_tr_positions-additionalcreationdata-nidru = value #( it_parameter[ name = 'Nidru' ]-value optional ). ls_tr_positions-additionalcreationdata-squit = value #( it_parameter[ name = 'Squit' ]-value optional ). ls_tr_positions-data-altme = value #( it_parameter[ name = 'Altme' ]-value optional ). ls_tr_positions-data-bwlvs = value #( it_parameter[ name = 'Bwlvs' ]-value optional ). ls_tr_positions-data-lgnum = value #( it_parameter[ name = 'Lgnum' ]-value optional ). ls_tr_positions-data-lgort = value #( it_parameter[ name = 'Lgort' ]-value optional ). ls_tr_positions-data-matnr = value #( it_parameter[ name = 'Matnr' ]-value optional ). ls_tr_positions-data-nlpla = value #( it_parameter[ name = 'Nlpla' ]-value optional ). ls_tr_positions-data-nltyp = value #( it_parameter[ name = 'Nltyp' ]-value optional ). ls_tr_positions-data-vlpla = value #( it_parameter[ name = 'Vlpla' ]-value optional ). ls_tr_positions-data-vltyp = value #( it_parameter[ name = 'Vltyp' ]-value optional ). ls_tr_positions-data-werks = value #( it_parameter[ name = 'Werks' ]-value optional ). append ls_tr_positions to lt_tr_positions. try. me->create_transport( changing cs_tr_head = ls_tr_head ct_tr_positions = lt_tr_positions ). me->copy_data_to_ref( exporting is_data = ls_tr_head-tanum changing cr_data = er_data ). catch zcx_sd_exception into data(lo_exception). data(lo_message_cont) = mo_context->get_message_container( ). lo_message_cont->add_message( iv_msg_type = lo_exception->get_msgty( ) iv_msg_id = lo_exception->get_msgid( ) iv_msg_number = lo_exception->get_msgno( ) iv_msg_v1 = lo_exception->get_msgv1( ) iv_msg_v2 = lo_exception->get_msgv2( ) iv_msg_v3 = lo_exception->get_msgv3( ) iv_msg_v4 = lo_exception->get_msgv4( ) ). raise exception type /iwbep/cx_mgw_busi_exception exporting message_container = lo_message_cont http_status_code = '400'. endtry. when others. super->/iwbep/if_mgw_appl_srv_runtime~execute_action( exporting iv_action_name = iv_action_name it_parameter = it_parameter io_tech_request_context = io_tech_request_context importing er_data = er_data ). endcase. endmethod.
Запустите Netweaver Gateway Client /IWFND/GW_CLIENT и укажите имя сервиса с функцией импорта и её параметрами. Url будет выглядеть наподобие:
/sap/opu/odata/sap/ZTEST_GW_SRV_SRV/demoFuncImport?Approved_Flag=’X’&CustId=’0000000001′
Замените HTTP-метод на POST и запускайте. Вы должны увидеть сообщение об успешном выполнении задачи, как ниже: