Интеграция с продуктами SAP через вызовы RFC-функций

Общий принцип взаимодействия продукта «Форсайт. Аналитическая платформа» и различных продуктов 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 имеется, то выполните следующие действия:

  1. В репозитории платформы создайте новую .NET-сборку.

  2. Добавьте ссылку на библиотеки SAP sapnco.dll и sapnco_utils.dll:

  3. В коде созданного .NET-модуля добавьте строки для импорта содержимого библиотек:

Imports SAP.Middleware.Connector;

  1. Добавьте код для подключения к SAP и вызова различных RFC-функций, указанный ниже.

Код для работы с RFC-функциями

При запуске процедуры Main выполняется два действия:

  1. Вызывается процедура Connection, которая осуществляет подключение к серверу SAP.

  2. Вызывается функция 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[
2Of 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;

См. также:

База знаний разработчиков