web-dev-qa-db-fra.com

Tutoriel étape par étape pour utiliser SAP. connecteur net avec VS 2008

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?

24
ridermansb

Un exemple utilisant vs2010 et SAP .NET Connector 3.0

Exigences:

  • Visual Studio .NET 2010 (l'édition gratuite c # Express est très bien)
  • SAP .NET Connector 3.0 (vous pouvez généralement l'obtenir auprès de votre client pour le projet en cours)

Installation

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).

Référencement

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.

De liaison

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

    }

Simplifier la vie

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;

Remarques

  • Bien que cet exemple soit basé sur vs2010, les autres éditions de Visual Studio devraient fonctionner correctement.
  • Il apparaît que les noms des fonctions SAP dans le connecteur doivent toujours être MAJUSCULES.
  • Si vous obtenez une mauvaise architecture du connecteur SAP, par exemple vous installez la version 64 bits puis essayez de compiler pour x86 32 bits, vous obtiendrez une erreur comme: "Impossible de charger le fichier ou l'assembly 'sapnco, Version = 3.0.0.42, Culture = neutre, PublicKeyToken = 50436dca5c7f7d23 'ou l'une de ses dépendances. Une tentative a été effectuée pour charger un programme avec un format incorrect. " Ceci est normal; installez simplement la bonne version.

Lecture supplémentaire

75
magma