インターネットで多くの例を見つけましたが、多くは古いものです (VS 2003、SAP. Net Connector 2.0 で現在は 3.0)。
SAP をどのように使用するのだろうか。ネットコネクタ。
どのファイルをインストールすればよいですか?
プロジェクトに追加する参照?
サーバー エクスプローラーで接続を作成するためにプロバイダーを追加する方法を教えてください。
インターネットで多くの例を見つけましたが、多くは古いものです (VS 2003、SAP. Net Connector 2.0 で現在は 3.0)。
SAP をどのように使用するのだろうか。ネットコネクタ。
どのファイルをインストールすればよいですか?
プロジェクトに追加する参照?
サーバー エクスプローラーで接続を作成するためにプロバイダーを追加する方法を教えてください。
要件:
プラットフォームの正しいバージョンを特定します。あなたは次のようなものを持っているかもしれません:
.. 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_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
}
上記の例では、関数は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;