Передача данных из SAP в источник данных Локальная БД (push данных из SAP)

В этой статье:

Подготовка проекта в «Форсайт. Мобильная платформа»

Шаг 1. Добавление источника данных Локальная БД

Шаг 2. Добавление группы пользователей

Шаг 3. Добавление пользователя API

Выполнение процедур в источнике данных SAP

При необходимости оперативной передачи данных из SAP в «Форсайт. Мобильная платформа» используйте ABAP-процедуры, которые позволяют выполнять инкрементальную загрузку данных через API сервера мобильной платформы:

Примечание. Выполнение второй процедуры доступно только при использовании полученного токена пользователя в результате выполнения первой процедуры.

Для передачи данных из SAP в «Форсайт. Мобильная платформа»:

  1. Подготовьте проект в «Форсайт. Мобильная платформа». В процессе подготовки проекта будет создан ресурс для источника данных Локальная БД и добавлен новый пользователь API. После выполнения аутентификации на сервере мобильной платформы пользователь сможет обращаться к созданному ресурсу через API сервера.

  2. Выполните процедуры в источнике данных SAP. В процессе выполнения процедур производится инкрементальная передача данных из SAP в «Форсайт. Мобильная платформа».

Примечание. По умолчанию при передаче данных из SAP используется протокол SOAP/XML, но при выполнении процедур используется формат передачи данных JSON. Преобразование данных в необходимый формат осуществляется в ABAP-процедурах и не требует дополнительных действий.

После выполнения действий будет подготовлен проект в «Форсайт. Мобильная платформа» и выполнены процедуры в системе SAP. В источнике данных Локальная БД подготовленного проекта будут содержаться данные, переданные из SAP.

Подготовка проекта в «Форсайт. Мобильная платформа»

Перед подготовкой проекта:

  1. Перейдите в раздел «Среды» и добавьте новую среду.

  2. Добавьте проект в новой среде.

После выполнения действий будет добавлен новый проект для дальнейшей подготовки.

Шаг 1. Добавление источника данных Локальная БД

Для добавления источника данных Локальная БД:

  1. Откройте новый проект.

  2. Добавьте источник данных Локальная БД с помощью раскрывающегося меню кнопки «Добавить источник данных».

После добавления источника данных нажмите кнопку «Создать ресурс». Будут открыты настройки импорта ресурса:

Задайте параметры:

Примечание. При импорте ресурса значение в поле «Название для мобильного клиента» должно совпадать с идентификатором репозитория.

Важно. При задании названия ресурса запрещено использование некоторых ключевых слов PostgreSQL. Для получения подробной информации о запрещенных ключевых словах обратитесь к документации PostgreSQL. При попытке использования запрещенных ключевых слов в названии ресурса будет выдано сообщение об ошибке.

Примечание. Настройка кэширования доступна только для скалярных входных параметров ресурса.

  1. Нажмите кнопку «Импортировать».

После выполнения действий будет добавлен источник данных Локальная БД в список источников данных проекта.

Шаг 2. Добавление группы пользователей

Для добавления группы пользователей:

  1. Перейдите в подраздел «Группы пользователей» и добавьте новую группу:

Задайте параметры:

  1. Нажмите кнопку «Добавить».

После выполнения действий будет добавлена новая группа пользователей в список групп проекта.

Шаг 3. Добавление пользователя API

Для добавления пользователя API:

  1. Перейдите в подраздел «Пользователи API» и добавьте нового пользователя:

Задайте параметры:

  1. Нажмите кнопку «Сохранить».

После выполнения действий будет добавлен новый пользователь API, состоящий в добавленной группе.

Выполнение процедур в источнике данных SAP

Передача данных из SAP осуществляется посредством выполнения процедур в системе SAP:

  1. Выполните первую процедуру для аутентификации на сервере мобильной платформы и получения токена пользователя:

FUNCTION zfmp_get_token.
  CONSTANTS: BEGIN OF lc_form_field,
               username    TYPE string VALUE 'username',
               environment TYPE string VALUE 'environment',
               password    TYPE string VALUE 'password',
               project     TYPE string VALUE 'project',
             END OF lc_form_field,
             lc_http         TYPE string VALUE '200',
             lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded'.
  DATA:
    lo_client TYPE REF TO if_http_client,
    lv_data   TYPE string,
    ls_data   TYPE zfmp_token,
    lv_mess   TYPE string.
  cl_http_client=>create(
    EXPORTING
      host               = host_server
    IMPORTING
      client             = lo_client
    EXCEPTIONS
      argument_not_found = 1
      internal_error     = 2
      plugin_not_active  = 3
      OTHERS             = 4 ).
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        lv_mess = text-002.
      WHEN 2.
        lv_mess = text-003.
      WHEN 3.
        lv_mess = text-004.
      WHEN 4.
        lv_mess = text-005.
    ENDCASE.
    MESSAGE s208(00) WITH lv_mess DISPLAY LIKE rs_c_error.
    EXIT.
  ENDIF.
  cl_http_utility=>set_request_uri( request = lo_client->request uri = api_server ).
  lo_client->request->set_method( if_http_request=>co_request_method_post ).
  lo_client->request->set_content_type( lv_content_type ).
  lo_client->request->set_form_field( name = lc_form_field-environment value = environment ).
  lo_client->request->set_form_field( name = lc_form_field-username    value = username ).
  lo_client->request->set_form_field( name = lc_form_field-password    value = password ).
  lo_client->request->set_form_field( name = lc_form_field-project     value = project ).
  lo_client->send(
      EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4 ).
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        lv_mess = text-006.
      WHEN 2.
        lv_mess = text-007.
      WHEN 3.
        lv_mess = text-008.
      WHEN 4.
        lv_mess = text-009.
    ENDCASE.
    MESSAGE s208(00) WITH lv_mess DISPLAY LIKE rs_c_error.
    EXIT.
  ENDIF.
  lo_client->receive(
   EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4 ).
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        lv_mess = text-006.
      WHEN 2.
        lv_mess = text-007.
      WHEN 3.
        lv_mess = text-008.
      WHEN 4.
        lv_mess = text-009.
    ENDCASE.
    MESSAGE s208(00) WITH lv_mess DISPLAY LIKE rs_c_error.
    EXIT.
  ENDIF.
  lv_data = lo_client->response->get_cdata( ).
  lo_client->response->get_status( IMPORTING code = DATA(http_rc) ).
  IF http_rc <> lc_http.
    MESSAGE s368(00) WITH text-001 http_rc DISPLAY LIKE rs_c_error.
    EXIT.
  ELSE.
    /ui2/cl_json=>deserialize(
             EXPORTING
                json        = lv_data
                pretty_name = /ui2/cl_json=>pretty_mode-camel_case
            CHANGING
                data        = ls_data ).
    IF ls_data-token IS NOT INITIAL.
      ls_data-username = username.
      MODIFY zfmp_token FROM ls_data.
    ELSE.
      MESSAGE s208(00) WITH text-010 http_rc DISPLAY LIKE rs_c_error .
      EXIT.
    ENDIF.
  ENDIF.
  lo_client->close( ).
ENDFUNCTION.

При выполнении первой процедуры будет отправлен API-запрос аутентификации на сервер мобильной платформы. В результате выполнения процедуры будет получен и сохранен токен пользователя.

  1. Разделите полученный токен пользователя на две части для подстановки во вторую процедуру.

Примечание. Разделение токена пользователя необходимо для соответствия требованиям графического редактора SAP. Первая часть токена не должна превышать 207 символов.

  1. Подготовьте вторую процедуру для выполнения. В коде процедуры задайте значения вместо следующих подстановок:

REPORT zmar_test.
PERFORM use_fmp.
FORM use_fmp.
  CONSTANTS:
    *Задайте IP-адрес или DNS-имя сервера мобильной платформы и название ресурса источника данных Локальная БД
    lc_host       TYPE string VALUE '<IP-адрес или DNS-имя сервера мобильной платформы>',
    lc_url        TYPE string VALUE '/api/v1/rpc/<название ресурса>/',
    *Вставьте первую часть токена в переменную lc_token_1 после значения «Bearer», вторую часть токена
    *присвойте переменной lc_token_2
    lc_token_1    TYPE string VALUE 'Bearer <первая часть токена>',
    lc_token_2    TYPE string VALUE '<вторая часть токена>',
    lc_auth       TYPE string VALUE 'Authorization',
    lc_content    TYPE string VALUE 'Content-Type',
    lc_json       TYPE string VALUE 'application/json',
    lc_data_start TYPE string VALUE '{"delete_ids":null,"upsert_rows":[',
    lc_number     TYPE i      VALUE 100,
    lc_count      TYPE int4   VALUE 10.
  DATA:
    lt_data       TYPE STANDARD TABLE OF string,
    lo_client     TYPE REF TO if_http_client,
    lv_data       TYPE string,
    lv_token      TYPE string,
    lv_value      TYPE string,
    lv_text       TYPE string,
    lv_check      TYPE i,
    lv_number     TYPE i,
    lv_size       TYPE i,
    lv_time_1     TYPE timestampl,
    lv_time_2     TYPE timestampl,
    lv_mess       TYPE string,
    lv_result     TYPE timestampl,
    lv_time_rec_1 TYPE timestampl,
    lv_time_rec_2 TYPE timestampl.
  cl_http_client=>create(
     EXPORTING
       host               = lc_host
     IMPORTING
       client             = lo_client
     EXCEPTIONS
       argument_not_found = 1
       internal_error     = 2
       plugin_not_active  = 3
       OTHERS             = 4 ).
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        lv_mess = text-002.
      WHEN 2.
        lv_mess = text-003.
      WHEN 3.
        lv_mess = text-004.
      WHEN 4.
        lv_mess = text-005.
    ENDCASE.
    MESSAGE s208(00) WITH lv_mess DISPLAY LIKE rs_c_error.
    LEAVE LIST-PROCESSING.
  ENDIF.
  WRITE: 'Количество строк: ', lc_count.
  SKIP.
  lv_token = lc_token_1 && lc_token_2.
  cl_http_utility=>set_request_uri( request = lo_client->request uri = lc_url ).
  lo_client->request->set_method( if_http_request=>co_request_method_post ).
  lo_client->request->set_header_field(
      EXPORTING
        name  = lc_auth
        value = lv_token  ).
  lo_client->request->set_header_field(
    EXPORTING
      name  = lc_content
      value = lc_json ).
  GET TIME STAMP FIELD lv_time_1.
  DO lc_count TIMES.
    CALL FUNCTION 'NUMBER_GET_NEXT'
      EXPORTING
        nr_range_nr = '1'
        object      = 'ZRO_PUSH_F'
      IMPORTING
        number      = lv_number.
    CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
      EXPORTING
        number_chars  = lc_number
      IMPORTING
        random_string = lv_text.
    lv_value = lv_value && '[' && lv_number && ',"' && lv_text && '"]'.
    CHECK sy-index < lc_count.
    lv_value = lv_value && ','.
  ENDDO.
  lv_value = lc_data_start && lv_value && ']}'.
  cl_soap_moni_helper=>convert_string_to_xstring(
    EXPORTING
      i_string = lv_value
    IMPORTING
      e_xstring = DATA(lv_value_new)
      e_length  = lv_size ).
  lo_client->request->set_data( lv_value_new ).
  lo_client->send(
      EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4 ).
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        lv_mess = text-006.
      WHEN 2.
        lv_mess = text-007.
      WHEN 3.
        lv_mess = text-008.
      WHEN 4.
        lv_mess = text-009.
    ENDCASE.
    MESSAGE s208(00) WITH lv_mess DISPLAY LIKE rs_c_error.
    EXIT.
  ENDIF.
  GET TIME STAMP FIELD lv_time_rec_1.
  lo_client->receive(
   EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4 ).
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        lv_mess = text-006.
      WHEN 2.
        lv_mess = text-007.
      WHEN 3.
        lv_mess = text-008.
      WHEN 4.
        lv_mess = text-009.
    ENDCASE.
    MESSAGE s208(00) WITH lv_mess DISPLAY LIKE rs_c_error.
    EXIT.
  ENDIF.
  GET TIME STAMP FIELD lv_time_rec_2.
  lv_result = lv_time_rec_1 - lv_time_rec_2.
  SKIP.
  WRITE: 'Время выполнения recieve (получение ответа от ' ,lc_host , '):', lv_result.
  GET TIME STAMP FIELD lv_time_2.
  lv_result = lv_time_1 - lv_time_2.
  SKIP.
  WRITE: 'Время выполнения программы без вывода txt и вывода результата на экран: ' , lv_result.
  CLEAR: lv_result,lv_time_2.
  lv_data = lo_client->response->get_cdata( ).
  WRITE lv_data.                              
  lo_client->response->get_status( IMPORTING code = DATA(http_rc) ).
  SKIP.
  WRITE: 'Ответ http: ' , http_rc.
  APPEND lv_data TO lt_data.
  GET TIME STAMP FIELD lv_time_2.
  lv_result = lv_time_1 - lv_time_2.
  SKIP.
  WRITE: 'Время выполнения программы без вывода txt: ' , lv_result.
  CLEAR: lv_result,lv_time_2.
  lo_client->close( ).
  GET TIME STAMP FIELD lv_time_2.
  lv_result = lv_time_1 - lv_time_2.
  SKIP.
  WRITE: 'Время выполнения программы: ' , lv_result.
ENDFORM.
  1. Выполните вторую процедуру для передачи данных из SAP в источник данных Локальная БД подготовленного проекта в «Форсайт. Мобильная платформа». При выполнении второй процедуры будет инициирована передача данных на сервер мобильной платформы через API-запрос.

Примечание. По умолчанию источник данных Локальная БД является базой данных PostgreSQL. При добавлении источника данных Локальная БД на сервере мобильной платформы создается внешнее API, с помощью которого доступно управление данными в источнике.

После выполнения действий в источнике данных Локальная БД будут содержаться данные, переданные из SAP.

См. также:

База знаний