Подтвердить что ты не робот

Пошаговое руководство по использованию SAP.NET Connector с VS 2008

Я нашел много примеров в Интернете, но многие из них старые (VS 2003, SAP.NET Connector 2.0, где текущий - 3.0).

Интересно, как использовать SAP. NET.

Какие файлы я должен установить?

Ссылки, добавляемые в проект?

Как добавить провайдера для создания соединения в Server Explorer?

4b9b3361

Ответ 1

Пример использования vs2010 и SAP.NET Connector 3.0

Требования:

  • Visual Studio.NET 2010 (бесплатная версия С# Express в порядке)
  • SAP.NET Connector 3.0 (обычно вы можете получить его у своего клиента для проекта)

Установка

Определите правильную версию для вашей платформы. У вас может быть что-то следующее:

T6rEd.png

.. для 64-разрядной установки Windows 7 мы будем использовать sapnco30dotnet40P_12-20007348.zip.

Разверните архив и запустите установочный файл .msi.

7ZcDi.png

.. следуйте процедуре установки, оставив все параметры по умолчанию (следующий.. следующий.. следующий.. закончить).

Referencing

Откройте Visual Studio и создайте новый проект (или откройте свой собственный).

В панели Solution Explorer, как правило, справа, щелкните правой кнопкой мыши по References и выберите Add Reference:

dAbL5.png

.. затем выберите вкладку Browse, перейдите в папку установки SAP Connector и выберите оба sapnco.dll и sapnco_utils.dll:

iKgQs.png

Теперь, когда вы правильно указали SAP.NET Connector в проекте Visual Studio, вы можете написать для него код.

Подключение

Начните с создания целевого класса конфигурации (замените параметры подключения теми, которые вы предоставили клиенту):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SAP.Middleware.Connector; // your sap connector

namespace WindowsFormsSapApplication1
{
    public class ECCDestinationConfig : IDestinationConfiguration
    {

        public bool ChangeEventsSupported()
        {
            return false;
        }

        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;

        public RfcConfigParameters GetParameters(string destinationName)
        {

            RfcConfigParameters parms = new RfcConfigParameters();

            if (destinationName.Equals("mySAPdestination"))
            {
                parms.Add(RfcConfigParameters.AppServerHost, "sapnode.mycompany.net");
                parms.Add(RfcConfigParameters.SystemNumber, "21");
                parms.Add(RfcConfigParameters.SystemID, "CF1");
                parms.Add(RfcConfigParameters.User, "mySAPuser");
                parms.Add(RfcConfigParameters.Password, "mySAPpassword");
                parms.Add(RfcConfigParameters.Client, "100");
                parms.Add(RfcConfigParameters.Language, "EN"); 
                parms.Add(RfcConfigParameters.PoolSize, "5");
            }
            return parms;

        }
    }
}

.. затем подключитесь к SAP и вызовите функцию. Предположим, что вы хотите получить список компаний, используя функцию BAPI_COMPANYCODE_GETLIST SAP:

    public void GetCompanies() {

        ECCDestinationConfig cfg = new ECCDestinationConfig();

        RfcDestinationManager.RegisterDestinationConfiguration(cfg);

        RfcDestination dest = RfcDestinationManager.GetDestination("mySAPdestination");

        RfcRepository repo = dest.Repository;

        IRfcFunction testfn = repo.CreateFunction("BAPI_COMPANYCODE_GETLIST");

        testfn.Invoke(dest);

        var companyCodeList = testfn.GetTable("COMPANYCODE_LIST");

        // companyCodeList now contains a table with companies and codes

    }

Сделать жизнь проще

В приведенном выше примере функция GetTable возвращает таблицу SAP, которая может вам понравиться, или нет. Там есть удобное расширение, которое преобразует эту таблицу в знакомый .NET DataTable следующим образом:

public static class IRfcTableExtentions
{
    /// <summary>
    /// Converts SAP table to .NET DataTable table
    /// </summary>
    /// <param name="sapTable">The SAP table to convert.</param>
    /// <returns></returns>
    public static DataTable ToDataTable(this IRfcTable sapTable, string name)
    {
        DataTable adoTable = new DataTable(name);
        //... Create ADO.Net table.
        for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
        {
            RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);
            adoTable.Columns.Add(metadata.Name, GetDataType(metadata.DataType));
        }

        //Transfer rows from SAP Table ADO.Net table.
        foreach (IRfcStructure row in sapTable)
        {
            DataRow ldr = adoTable.NewRow();
            for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
            {
                RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);

                switch (metadata.DataType)
                {
                    case RfcDataType.DATE:
                        ldr[metadata.Name] = row.GetString(metadata.Name).Substring(0, 4) + row.GetString(metadata.Name).Substring(5, 2) + row.GetString(metadata.Name).Substring(8, 2);
                        break;
                    case RfcDataType.BCD:
                        ldr[metadata.Name] = row.GetDecimal(metadata.Name);
                        break;
                    case RfcDataType.CHAR:
                        ldr[metadata.Name] = row.GetString(metadata.Name);
                        break;
                    case RfcDataType.STRING:
                        ldr[metadata.Name] = row.GetString(metadata.Name);
                        break;
                    case RfcDataType.INT2:
                        ldr[metadata.Name] = row.GetInt(metadata.Name);
                        break;
                    case RfcDataType.INT4:
                        ldr[metadata.Name] = row.GetInt(metadata.Name);
                        break;
                    case RfcDataType.FLOAT:
                        ldr[metadata.Name] = row.GetDouble(metadata.Name);
                        break;
                    default:
                        ldr[metadata.Name] = row.GetString(metadata.Name);
                        break;
                }
            }
            adoTable.Rows.Add(ldr);
        }
        return adoTable;
    }

    private static Type GetDataType(RfcDataType rfcDataType)
    {
        switch (rfcDataType)
        {
            case RfcDataType.DATE:
                return typeof(string);
            case RfcDataType.CHAR:
                return typeof(string);
            case RfcDataType.STRING:
                return typeof(string);
            case RfcDataType.BCD:
                return typeof(decimal);
            case RfcDataType.INT2:
                return typeof(int);
            case RfcDataType.INT4:
                return typeof(int);
            case RfcDataType.FLOAT:
                return typeof(double);
            default:
                return typeof(string);
        }
    }
}

Ссылка: http://antswift.wordpress.com/2011/12/22/irfctable-to-net-datatable-extention-method/

После добавления вышеуказанного расширения теперь вы можете преобразовать результат в DataTable:

// get the regular SAP structured table..
var companyCodeList = testfn.GetTable("COMPANYCODE_LIST");

// turn it into a DataTable..
var companyDataTable = companyCodeList.ToDataTable();

// use it
SomeForm.DataGridView.DataSource=companyDataTable;

Примечания

  • Пока этот пример основан на vs2010, другие версии Visual Studio должны работать нормально.
  • Похоже, что имена функций SAP в коннекторе всегда должны быть UPPERCASE.
  • Если вы ошиблись в архитектуре SAP Connector, например. вы устанавливаете 64-битную версию и затем пытаетесь скомпилировать 32-разрядную версию x86, вы получите сообщение об ошибке: "Не удалось загрузить файл или сборку sapnco, Version = 3.0.0.42, Culture = neutral, PublicKeyToken = 50436dca5c7f7d23" или один из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом ". Это нормально; просто установите правильную версию.

Дополнительное чтение