J'ai trouvé de nombreux exemples sur Internet mais beaucoup sont anciens (VS 2003, SAP. Net Connector 2.0 où le courant est 3.0).
Je me demande comment utiliser SAP. Connecteur NET.
Quels fichiers dois-je installer?
Des références qui s'ajoutent au projet?
Comment ajouter le fournisseur pour créer une connexion dans l'Explorateur de serveurs?
Exigences:
Identifiez la version appropriée pour votre plateforme. Vous pourriez avoir quelque chose le long de ce qui suit:
.. pour une installation de Windows 7 64 bits, nous utiliserons sapnco30dotnet40P_12-20007348.Zip
.
Développez l'archive et démarrez le .msi
fichier d'installation.
.. suivez la procédure d'installation, en laissant toutes les options par défaut (suivant .. suivant .. suivant .. terminer).
Ouvrez Visual Studio et créez un nouveau projet (ou ouvrez le vôtre).
Dans le Solution Explorer
panneau, généralement à votre droite, cliquez avec le bouton droit sur References
et choisissez Add Reference
:
.. puis sélectionnez l'onglet Browse
, accédez au dossier d'installation de SAP Connector et sélectionnez les deux sapnco.dll
et sapnco_utils.dll
:
Maintenant que vous avez correctement référencé le connecteur SAP .NET dans votre projet Visual Studio, vous pouvez écrire du code pour celui-ci.
Commencez par créer une classe de configuration de destination (remplacez les paramètres de connexion par ceux qui vous sont fournis par votre client):
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;
}
}
}
.. puis connectez-vous à SAP et appelez une fonction. Supposons que vous souhaitiez récupérer la liste des sociétés, à l'aide du BAPI_COMPANYCODE_GETLIST
Fonction 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
}
Dans l'exemple ci-dessus, la fonction GetTable
renvoie une table [~ # ~] sap [~ # ~] que vous pourriez aimer, ou pas. Il existe une extension pratique qui transforme cette table dans un .NET DataTable
familier, comme suit:
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);
}
}
}
Référence: http://antswift.wordpress.com/2011/12/22/irfctable-to-net-datatable-extention-method/
Après avoir ajouté l'extension ci-dessus, vous pouvez maintenant transformer le résultat en 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;