Общий принцип взаимодействия продукта «Форсайт. Аналитическая платформа» и различных продуктов SAP представлен в подразделе «Подключение к SAP». В данной статье представлено описание по настройке взаимодействия с использованием удалённого вызова функций (RFC). RFC - стандартный интерфейс взаимодействия и обмена данными между различными продуктами SAP. Для подключения, вызова RFC-функций и обработки полученных данных потребуется разработка прикладного приложения на языке Fore.NET.
Для подключения к SAP RFC используется SAP.Net Connector 3.0. Важной частью является наличие библиотек sapnco.dll и sapnco_utils.dll. Для получения данных библиотек обратитесь в SAP Market Place, при этом вы должны иметь идентификатор пользователя и пароль для скачивания. Если идентификатор и пароль отсутствуют, то обратитесь к специалистам SAP Basis за помощью в получении указанных библиотек. Разрядность используемой версии «Форсайт. Аналитическая платформа» должна быть такой же, какую имеют полученные библиотеки.
Если всё для использования SAP.Net Connector 3.0 имеется, то выполните следующие действия:
В репозитории платформы создайте новую .NET-сборку.
Добавьте ссылку на библиотеки SAP sapnco.dll и sapnco_utils.dll:
В коде созданного .NET-модуля добавьте строки для импорта содержимого библиотек:
Imports SAP.Middleware.Connector;
Добавьте код для подключения к SAP и вызова различных RFC-функций, указанный ниже.
При запуске процедуры Main выполняется два действия:
Вызывается процедура Connection, которая осуществляет подключение к серверу SAP.
Вызывается функция executeSAPFunction, которая выполняет RFC-функцию и возвращает результат. Список параметров, формируемых в переменной SAPParams, а также наименование RFC-функции и наименование возвращаемой таблицы, указываемые в процедуре executeSAPFunction, должны соответствовать сигнатуре вызываемой RFC-функции.
Результат выполнения функции будет доступен в переменной DataTable и в дальнейшем может быть использован для получения и обработки данных с помощью различных инструментов «Форсайт. Аналитическая платформа».
Imports System;
Imports Prognoz.Platform.Interop.Metabase;
Imports SAP.Middleware.Connector;
Public Class StartParams
Private m_Metabase: Prognoz.Platform.Interop.Metabase.IMetabase;
Public Property Metabase: Prognoz.Platform.Interop.Metabase.IMetabase
Get
Begin
Return m_Metabase
End Get
Set
Begin
m_Metabase := Value;
End Set
End Property Metabase;
End Class;
Public Class Program
Public Shared ConfigInitialized: boolean;
Public Shared rfcDestination: RfcDestination;
[STAThread]
Public Shared Sub Main(Params: StartParams);
Var
SAPParams: array[2] Of SAPParam;
DataTable: IRfcTable;
config: IDestinationConfiguration;
Begin
Connection();
SAPParams[0] := New SAPParam("Country", "Russia");
SAPParams[1] := New SAPParam("Retail", "Food");
DataTable := executeSAPFunction("GetData", "Table", SAPParams);
//...
//Дальнейшее использование DataTable для взаимодействия с объектами платформы
//...
End Sub;
Private Shared Sub Connection();
Var
config: IDestinationConfiguration;
Begin
If Not ConfigInitialized Then
config := New SAPDestinationConfig();
config.GetParameters("TEST");
RfcDestinationManager.RegisterDestinationConfiguration(config);
ConfigInitialized := True;
End If;
rfcDestination := RfcDestinationManager.GetDestination("TEST");
rfcDestination.Ping();
End Sub;
Private Shared Function executeSAPFunction(functionName: string; resultTableName: string; Paramarray params: array Of SAPParam): IRfcTable;
Var
func: IRfcFunction;
Begin
func := getSapFunction(functionName, params);
Try
func.Invoke(rfcDestination);
Return func.GetTable(resultTableName);
Except On e: RfcBaseException Do
System.Diagnostics.Debug.WriteLine(e.Message);
Finally
End Try;
End Function;
Private Shared Function getSapFunction(functionName: string; Paramarray params: array Of SAPParam): IRfcFunction;
Var
func: IRfcFunction;
param: SAPParam;
Begin
func := rfcDestination.Repository.CreateFunction(functionName);
For Each param In params Do
func.SetValue(param.name, param.value);
End For;
Return func;
End Function;
End Class;
Public Class SAPParam
Public name: string;
Public value: object;
Public Constructor SAPParam(_name: string; _value: object);
Begin
name := _name;
value := _value;
End Constructor;
End Class;
Class SAPDestinationConfig: IDestinationConfiguration
Public Function ChangeEventsSupported(): boolean;
Begin
Return False;
End Function;
Public Event ConfigurationChanged: RFCDestinationManager.ConfigurationChangeHandler;
Public Function GetParameters(destinationName: string): RfcConfigParameters;
Var
params: RfcConfigParameters;
Begin
params := New RfcConfigParameters();
params.Add(RfcConfigParameters.Name, "TEST");
params.Add(RfcConfigParameters.AppServerHost, "ServerName");
params.Add(RfcConfigParameters.SystemNumber, "0");
params.Add(RfcConfigParameters.SystemID, "100");
params.Add(RfcConfigParameters.User, "username");
params.Add(RfcConfigParameters.Password, "password");
params.Add(RfcConfigParameters.Client, "100");
params.Add(RfcConfigParameters.Language, "EN");
params.Add(RfcConfigParameters.PoolSize, "10");
Return params;
End Function;
End Class;
См. также: