27

インターネットで多くの例を見つけましたが、多くは古いものです (VS 2003、SAP. Net Connector 2.0 で現在は 3.0)。

SAP をどのように使用するのだろうか。ネットコネクタ。

どのファイルをインストールすればよいですか?

プロジェクトに追加する参照?

サーバー エクスプローラーで接続を作成するためにプロバイダーを追加する方法を教えてください。

4

1 に答える 1

86

vs2010 と SAP .NET Connector 3.0 を使用した例

要件:

  • Visual Studio .NET 2010 (無料の c# Express エディションで問題ありません)
  • SAP .NET Connector 3.0 (通常、手元のプロジェクト用にクライアントから入手できます)

インストール

プラットフォームの正しいバージョンを特定します。あなたは次のようなものを持っているかもしれません:

.. Windows 7 64 ビット インストールの場合は、sapnco30dotnet40P_12-20007348.zip.

アーカイブを展開し、.msiインストール ファイルを開始します。

.. すべてのデフォルト オプションを残して、インストール手順に従います (next..next..next..finish)。

参照する

Visual Studio を開き、新しいプロジェクトを作成します (または独自のプロジェクトを開きます)。

パネルで、通常はSolution Explorer右側にあり、右クリックして次Referencesを選択しますAdd Reference

.. 次に、Browseタブを選択し、SAP コネクタのインストール フォルダに移動して、 と の両方を選択しsapnco.dllますsapnco_utils.dll

Visual Studio プロジェクトで SAP .NET コネクタを正しく参照したので、コードを記述できます。

接続中

宛先構成クラスを作成することから始めます (接続パラメーターを、クライアントから提供されたものに置き換えます)。

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_GETLISTSAP 関数を使用して、会社のリストを取得するとします。

    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

    }

生活を楽にする

上記の例では、関数はSAPテーブルをGetTable返します。次のように、使い慣れた .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 関数名は常に大文字にする必要があるようです。
  • たとえば、64 ビット バージョンをインストールしてから 32 ビット x86 用にコンパイルしようとすると、SAP コネクタ アーキテクチャが間違っている場合、次のようなエラーが表示されます。 =neutral, PublicKeyToken=50436dca5c7f7d23' またはその依存関係の 1 つです。不正な形式のプログラムを読み込もうとしました。" これは正常です; 正しいバージョンをインストールするだけです。

追加資料

于 2014-02-14T19:08:27.210 に答える