В этой статье:
Подготовка проекта в «Форсайт. Мобильная платформа»
Шаг 1. Добавление источника данных Локальная БД
Шаг 2. Добавление группы пользователей
При необходимости оперативной передачи данных из SAP в «Форсайт. Мобильная платформа» используйте ABAP-процедуры, которые позволяют выполнять инкрементальную загрузку данных через API сервера мобильной платформы:
первая процедура инициирует отправку запроса на сервер мобильной платформы для аутентификации пользователя и осуществляет сохранение полученного токена пользователя;
вторая процедура осуществляет передачу данных из SAP в ресурс источника данных Локальная БД подготовленного проекта. Переданные данные в «Форсайт. Мобильная платформа» кэшируются и выполняется расчёт дельты, которая передаётся на мобильное устройство.
Примечание. Выполнение второй процедуры доступно только при использовании полученного токена пользователя в результате выполнения первой процедуры.
Для передачи данных из SAP в «Форсайт. Мобильная платформа»:
Подготовьте проект в «Форсайт. Мобильная платформа». В процессе подготовки проекта будет создан ресурс для источника данных Локальная БД и добавлен новый пользователь API. После выполнения аутентификации на сервере мобильной платформы пользователь сможет обращаться к созданному ресурсу через API сервера.
Выполните процедуры в источнике данных SAP. В процессе выполнения процедур производится инкрементальная передача данных из SAP в «Форсайт. Мобильная платформа».
Примечание. По умолчанию при передаче данных из SAP используется протокол SOAP/XML, но при выполнении процедур используется формат передачи данных JSON. Преобразование данных в необходимый формат осуществляется в ABAP-процедурах и не требует дополнительных действий.
После выполнения действий будет подготовлен проект в «Форсайт. Мобильная платформа» и выполнены процедуры в системе SAP. В источнике данных Локальная БД подготовленного проекта будут содержаться данные, переданные из SAP.
Перед подготовкой проекта:
Перейдите в раздел «Среды» и добавьте новую среду.
Добавьте проект в новой среде.
После выполнения действий будет добавлен новый проект для дальнейшей подготовки.
Для добавления источника данных Локальная БД:
Откройте новый проект.
Добавьте источник данных Локальная БД с помощью раскрывающегося меню кнопки «Добавить источник данных».
После добавления источника данных нажмите кнопку «Создать ресурс». Будут открыты настройки импорта ресурса:
Задайте параметры:
Название для мобильного клиента. Введите название ресурса, содержащее допустимые в URL символы. Параметр используется в запросах на получение данных из ресурса. Поле обязательно для заполнения;
Примечание. При импорте ресурса значение в поле «Название для мобильного клиента» должно совпадать с идентификатором репозитория.
Название в источнике данных. Введите название ресурса, который будет создан в источнике данных. Поле обязательно для заполнения;
Важно. При задании названия ресурса запрещено использование некоторых ключевых слов PostgreSQL. Для получения подробной информации о запрещенных ключевых словах обратитесь к документации PostgreSQL. При попытке использования запрещенных ключевых слов в названии ресурса будет выдано сообщение об ошибке.
Кэшировать. При необходимости установите флажок для доступа к настройкам кэширования.
Примечание. Настройка кэширования доступна только для скалярных входных параметров ресурса.
Нажмите кнопку «Импортировать».
После выполнения действий будет добавлен источник данных Локальная БД в список источников данных проекта.
Для добавления группы пользователей:
Перейдите в подраздел «Группы пользователей» и добавьте новую группу:
Задайте параметры:
Название. Введите название группы пользователей в платформе. Поле обязательно для заполнения;
Доступ к ресурсам. Перенесите импортированный ресурс в список разрешенного доступа к ресурсам с помощью кнопки «Разрешить». Для удобного поиска необходимых ресурсов используйте фильтры под списками ресурсов.
Нажмите кнопку «Добавить».
После выполнения действий будет добавлена новая группа пользователей в список групп проекта.
Для добавления пользователя API:
Перейдите в подраздел «Пользователи API» и добавьте нового пользователя:
Задайте параметры:
Тип аутентификации. Выберите тип аутентификации пользователя «Локально». Проверка подлинности пользователя происходит в локальной базе данных на сервере мобильной платформы. Поле обязательно для заполнения;
Логин. Задайте имя пользователя длиной не более 104 символов. Допустимо использование цифр, пробелов, латинских и кириллических символов в верхнем и нижнем регистре, а также спецсимволов: ‘_-)(^%$#. Поле обязательно для заполнения;
Активен. Установите флажок для активации пользователя в системе и для доступа к работе с мобильной платформой. Активному пользователю доступна аутентификация и выполнение различных API-запросов. Если флажок не установлен, то пользователь деактивирован;
Пароль. Задайте пароль для учетной записи, состоящий из пяти и более символов кодировки UTF-8 и удовлетворяющий заданными требованиями. Пароль используется для авторизации пользователя API через мобильное устройство и последующей смены пароля пользователем, если установлен флажок «Одноразовый пароль». Для автоматической генерации пароля с учетом заданных требований нажмите кнопку «Сгенерировать». Сгенерированный пароль будет отображен в поле «Пароль» и доступен для редактирования. Для проверки соответствия пароля заданным требованиям используйте API-метод check_new_password, для смены пароля - API-метод change_password. Поле обязательно для заполнения;
Повторитe пароль. Повторите заданный пароль учетной записи. Поле обязательно для заполнения;
Группы. Выберите добавленную группу пользователей, в которой будет состоять пользователь.
Нажмите кнопку «Сохранить».
После выполнения действий будет добавлен новый пользователь API, состоящий в добавленной группе.
Передача данных из SAP осуществляется посредством выполнения процедур в системе SAP:
Выполните первую процедуру для аутентификации на сервере мобильной платформы и получения токена пользователя:
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-запрос аутентификации на сервер мобильной платформы. В результате выполнения процедуры будет получен и сохранен токен пользователя.
Разделите полученный токен пользователя на две части для подстановки во вторую процедуру.
Примечание. Разделение токена пользователя необходимо для соответствия требованиям графического редактора SAP. Первая часть токена не должна превышать 207 символов.
Подготовьте вторую процедуру для выполнения. В коде процедуры задайте значения вместо следующих подстановок:
<IP-адрес или DNS-имя сервера мобильной платформы>;
<название ресурса>;
<первая часть токена>;
<вторая часть токена>.
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.
Выполните вторую процедуру для передачи данных из SAP в источник данных Локальная БД подготовленного проекта в «Форсайт. Мобильная платформа». При выполнении второй процедуры будет инициирована передача данных на сервер мобильной платформы через API-запрос.
Примечание. По умолчанию источник данных Локальная БД является базой данных PostgreSQL. При добавлении источника данных Локальная БД на сервере мобильной платформы создается внешнее API, с помощью которого доступно управление данными в источнике.
После выполнения действий в источнике данных Локальная БД будут содержаться данные, переданные из SAP.
См. также: