Импортируемая функция OData

Концепция немного похожа на концепцию статических функций в языках программирования.

Задача:
была реализована служба 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 и запускайте. Вы должны увидеть сообщение об успешном выполнении задачи, как ниже: