web-dev-qa-db-ja.com

SAPを使用するための段階的なチュートリアル。 VS 2008のネットコネクタ

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

SAPの使用方法を知りたい。 NETコネクタ。

どのファイルをインストールする必要がありますか?

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

サーバーエクスプローラーで接続を作成するプロバイダーを追加する方法は?

24
ridermansb

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

要件:

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

Installation

プラットフォームの正しいバージョンを特定します。以下に沿って何かがあるかもしれません:

.. Windows 7 64ビットインストールの場合、sapnco30dotnet40P_12-20007348.Zipを使用します。

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

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

参照

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

Solution Explorerパネル(通常は右側)で、Referencesを右クリックし、Add Referenceを選択します。

..次に、Browseタブを選択し、SAP Connectorインストールフォルダーに移動して、sapnco.dllsapnco_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_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コネクタアーキテクチャが間違っている場合、たとえば64ビットバージョンをインストールしてから32ビットx86用にコンパイルしようとすると、次のようなエラーが表示されます。 "ファイルまたはアセンブリ 'sapnco、Version = 3.0.0.42、Culture =ニュートラル、PublicKeyToken = 50436dca5c7f7d23 'またはその依存関係の1つ。不正な形式のプログラムをロードしようとしました。 "これは正常です。正しいバージョンをインストールするだけです。

追加の読書

75
magma