Interroger Dynamics AX depuis une application .NET

Le composant.NET Business Connector permet le développement d’applications tierces qui s’intègrent à Microsoft Dynamics AX. Il fourni un ensemble de classes « managed» .NET permettant d’accéder aux classes X++ de Microsoft Dynamics AX.

Dans l’espace de noms Microsoft.Dynamics.BusinessConnectorNet il y a 5 classes souvent utilisées :

  • Axapta – la classe la plus importante. Parmi de nombreuse fonctionnalités, la classe offre les méthodes de connexion Logon() et Logoff().
  • AxaptaObject – représente une abstraction d’une classe X++ définie dans Dynamics Ax. Pour appeler les méthodes de ces objets on utilise les méthodes « Call » de la classe Axapta.
  • AxaptaRecord – fourni les méthodes de lecture/écriture d’enregistrements DynamicsAx.
  • AxaptaContainer – fourni les méthodes de lecture/écriture dans des conteneurs Axapta.
  • AxaptaBuffer – fourni les moyens d’utiliser une zone de mémoire tampon pour le transfert de données.


L’utilisation de la librairie BusinessConnectorNET

Avant d’utiliser BusinessConnectorNET la première étape est d’ajouter dans Visual Studio une référence à l’assembly Microsoft.Dynamics.BusinessConnectorNet

On appelle la méthode Logon() ou LogonAs() pour se connecter au Dynamics Ax :


using (var DynAx = new Axapta())
{
// Authenticate the user and establish a session.
DynAx.LogonAs("user", "domain", null, null, null, null, "configuration");

// TODO : Use DynAx for Axapta calls
}

Voici un exemple de code plus complet qui récupère la totalité d’enregistrements dans la table SalesLine de Dynamics AX et qui affiche les valeurs des champs SalesPrice et SalesStatus:

using (var DynAx = new Axapta())
{
    // Authenticate   the user and establish a session.
    DynAx.LogonAs("user", "domain", null, null, null, null, "configuration");

    using (var salesLineRecord = DynAx.CreateAxaptaRecord("SalesLine"))
    {
        //get all   sales lines
        DynAx.ExecuteStmt("select * from %1", salesLineRecord);

        if (salesLineRecord.Found)
        {
            do
            {
                //display sales line price
                string salesPrice = string.Format("{0} = {1}",
                       salesLineRecord.get_FieldLabel("SalesPrice"),
                       salesLineRecord.get_Field("SalesPrice"));
                Console.WriteLine(salesPrice);

                //display sales line status
                string salesStatus = string.Format("{0} = {1}",
                       salesLineRecord.get_FieldLabel("SalesStatus"),
                       salesLineRecord.get_Field("SalesStatus"));
                Console.WriteLine(salesStatus);
                Console.WriteLine("-----------------------------------");
            } while (salesLineRecord.Next());
        }
    }
}

D’abord on s’identifie dans Dynamics Ax utilisant la méthode LogonAs() de la classe Axapta ensuite on crée un objet AxaptaRecord pour la table SalesLine. Pour indiquer les données à récupérer on utilise ensuite une syntaxe X++ SELECT similaire au T-SQL :

select * from %1

Enfin, de la même façon dont on utilise la classe SqlReader en ADO .NET, on parcourt tous les enregistrements de la table SalesLine et on affiche les champs SalesPrice et SalesStatus.

Voici le résultat à l’exécution du code :

La valeur SalesStatus (« Statut de ligne ») est une valeur de type énumération. Si on visualise la valeur dans Dynamics Ax on voit qu’il s’agit d’une chaîne de caractères au lieu d’un numéro. Voici le même code d’avant mais cette fois on récupère la bonne valeur d’affichage:

using (var DynAx = new Axapta())
{
    // Authenticate   the user and establish a session.
    DynAx.LogonAs("user", "domain", null, null, null, null, "configuration");

    using (var salesLineRecord = DynAx.CreateAxaptaRecord("SalesLine"))
    {
        //get all   sales lines
        DynAx.ExecuteStmt("select * from %1", salesLineRecord);

        if (salesLineRecord.Found)
        {
            do
            {
                //display   sales line price
                string salesPrice = string.Format("{0} = {1}",
                        salesLineRecord.get_FieldLabel("SalesPrice"),
                        salesLineRecord.get_Field("SalesPrice"));
                Console.WriteLine(salesPrice);

                //display   sales line string status
                int enumValue = (int)salesLineRecord.get_Field("SalesStatus");
                int enum_id = (int)DynAx.CallStaticClassMethod(
                                         "Global",
                                         "enumName2Id",
                                         "SalesStatus");
                String enumStringValue;
                using (AxaptaObject dictEnum =
                    (AxaptaObject)DynAx.CreateAxaptaObject("DictEnum", enum_id))
                {
                    enumStringValue = (String)dictEnum.Call(
                                              "Value2Name",
                                              enumValue);
                }

                string salesStatus = string.Format("{0} = {1}",
                         salesLineRecord.get_FieldLabel("SalesStatus"),
                         enumStringValue);

                Console.WriteLine(salesStatus);
                Console.WriteLine("-----------------------------------");
            } while (salesLineRecord.Next());
        }
    }
}

Voici au-dessous les lignes de code qui ont changé par rapport à l’exemple précédent pour afficher la bonne valeur de l’énumération:

  • Récupération valeur champ SalesStatus dans la table SalesLine. Cette ligne existait déjà avant :
    int enumValue = (int)salesLineRecord.get_Field("SalesStatus");
  • Appel méthode statique enumName2Id de la classe Global avec le paramètre SalesStatus.
    int enum_id = (int) DynAx.CallStaticClassMethod("Global",
    "enumName2Id",
    "SalesStatus");
  • Création objet AxapaObject représentant la class DictEnum qui contient des informations concernant les énumérations présentes dans Application Object Tree (AOT).
    AxaptaObject dictEnum = (AxaptaObject)DynAx.CreateAxaptaObject(
    "DictEnum",
    enum_id)
  • Appel méthode Value2Name sur l’objet DictEnum qui retourne la valeur désirée pour l’énumération.
    enumStringValue = (String)dictEnum.Call("Value2Name", enumValue);

Références

  1. http://msdn.microsoft.com/fr-fr/library/aa659581.aspx – .NET Business Connector Overview
  2. http://www.packtpub.com/article/working-with-microsoft-dynamics-ax-and-net-1 – Working with Microsoft Dynamics AX and .NET: Part 1
  3. http://www.packtpub.com/article/working-with-microsoft-dynamics-ax-and-net-2 – Working with Microsoft Dynamics AX and .NET: Part 2
  4. http://www.axcus.com/axdoc/index.html – Axapta reference
  5. http://axsnap.codeplex.com/ – Microsoft Dynamics Snap for Microsoft Dynamics AX
  6. http://msdn.microsoft.com/en-us/library/aa867122.aspx – X++ Language Programming Guide

2 réflexions au sujet de « Interroger Dynamics AX depuis une application .NET »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *