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

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

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

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

Рекомендации, которые добавляют в проект?

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

1 ответ

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

Требования:

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

Монтаж

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

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

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

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

привязка

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

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

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

Теперь, когда вы правильно сослались на коннектор SAP.NET в своем проекте 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 в Соединителе всегда должны быть в верхнем регистре.
  • Если вы ошиблись в архитектуре SAP Connector, например, установили 64-битную версию, а затем попытались скомпилировать 32-битную версию x86, вы получите сообщение об ошибке: "Не удалось загрузить файл или сборку" sapnco, Version=3.0.0.42, Culture= нейтральный, PublicKeyToken=50436dca5c7f7d23'или одна из его зависимостей. Была предпринята попытка загрузить программу с неверным форматом." Это нормально; просто установите правильную версию.

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

Другие вопросы по тегам