Miklix

Appel des services de documents AIF directement depuis X++ dans Dynamics AX 2012

Publié : 16 février 2025 à 11:22:58 UTC
Dernière mise à jour : 12 janvier 2026 à 08:55:14 UTC

Dans cet article, j'explique comment appeler les services de documents Application Integration Framework dans Dynamics AX 2012 directement à partir du code X++, en émulant les appels entrants et sortants, ce qui peut faciliter considérablement la recherche et le débogage des erreurs dans le code AIF.


Cette page a été traduite de l'anglais afin de la rendre accessible au plus grand nombre. Malheureusement, la traduction automatique n'est pas encore une technologie parfaite, et des erreurs peuvent donc se produire. Si vous préférez, vous pouvez consulter la version originale en anglais ici :

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Les informations contenues dans cet article sont basées sur Dynamics AX 2012 R3. Elles peuvent ne pas être valides pour d'autres versions.

J'ai récemment aidé un client à implémenter un port d'entrée AIF (Application Integration Framework) pour la création de clients à partir de données provenant d'un autre système. Dynamics AX fournissant déjà le service de documents CustCustomer qui gère cette logique, nous avons opté pour la simplicité et utilisé la solution standard.

Cependant, il est vite apparu que la génération de XML par le système externe, compatible avec Dynamics AX, posait de nombreux problèmes. Le schéma XML généré par Dynamics AX est assez complexe et il semble que Dynamics AX contienne quelques bogues qui l'amènent parfois à rejeter des fichiers XML pourtant valides selon d'autres outils. En définitive, la tâche s'est avérée plus complexe que prévu.

Au cours de ce projet, j'ai souvent eu du mal à identifier précisément le problème avec certains fichiers XML, car les messages d'erreur fournis par AIF sont peu explicites. C'était également fastidieux, car je devais attendre que le système externe envoie un nouveau message via MSMQ, puis qu'AIF le récupère et le traite avant de pouvoir identifier l'erreur.

J'ai donc cherché à savoir s'il était possible d'appeler directement le code du service avec un fichier XML local pour des tests un peu plus rapides, et il s'avère que oui ; de plus, c'est très simple à faire et cela fournit des messages d'erreur beaucoup plus pertinents.

L'exemple de tâche ci-dessous lit un fichier XML local et tente de l'utiliser avec la classe AxdCustomer (qui est la classe de document utilisée par le service CustCustomer) pour créer un client. Vous pouvez créer des tâches similaires pour toutes les autres classes de document, par exemple AxdSalesOrder, si nécessaire.

static void CustomerCreate(Args _args)
{
    FileNameOpen fileName    = @'C:\\TestCustomerCreate.xml';
    AxdCustomer  customer;
    AifEntityKey key;
    #File
    ;

    new FileIoPermission(fileName, #IO_Read).assert();

    customer = new AxdCustomer();

    key = customer.create(  XmlDocument::newFile(fileName).xml(),
                            new AifEndpointActionPolicyInfo(),
                            new AifConstraintList());

    CodeAccessPermission::revertAssert();

    info('Done');
}

L'objet AifEntityKey renvoyé par la méthode customer.create() (qui correspond à l'opération de service « create » dans AIF) contient des informations sur le client créé, notamment l'identifiant RecId de l'enregistrement CustTable créé.

Si vous souhaitez tester un port sortant ou si vous avez simplement besoin d'un exemple de l'apparence du XML sur le port entrant, vous pouvez également utiliser la classe de document pour exporter un client vers un fichier en appelant la méthode read() (correspondant à l'opération de service « read »), comme ceci :

static void CustomerRead(Args _args)
{
    FileNameSave    fileName = @'C:\\TestCustomerRead.xml';
    Map             map      = new Map( Types::Integer,
                                        Types::Container);
    AxdCustomer     customer;
    AifEntityKey    key;
    XMLDocument     xmlDoc;
    XML             xml;
    AifPropertyBag  bag;
    #File
    ;

    map.insert(fieldNum(CustTable, AccountNum), ['123456']);
    key = new AifEntityKey();
    key.parmTableId(tableNum(CustTable));
    key.parmKeyDataMap(map);
    customer = new AxdCustomer();

    xml = customer.read(key,
                        null,
                        new AifEndpointActionPolicyInfo(),
                        new AifConstraintList(),
                        bag);

    new FileIoPermission(fileName, #IO_Write).assert();
    xmlDoc = XmlDocument::newXml(xml);
    xmlDoc.save(fileName);
    CodeAccessPermission::revertAssert();
    info('Done');
}

Vous devez bien sûr remplacer « 123456 » par le numéro de compte du client dont vous souhaitez consulter les informations.

Lectures complémentaires

Si vous avez apprécié cet article, vous aimerez peut-être aussi ces suggestions :


Partager sur BlueskyPartager sur FacebookPartager sur LinkedInPartager sur TumblrPartager sur XPartager sur LinkedInÉpingler sur Pinterest

Mikkel Christensen

A propos de l'auteur

Mikkel Christensen
Mikkel est le créateur et le propriétaire de miklix.com. Il a plus de 20 ans d'expérience en tant que programmeur informatique professionnel/développeur de logiciels et travaille actuellement à plein temps pour une grande entreprise européenne de TI. Lorsqu'il ne blogue pas, il consacre son temps libre à un large éventail d'intérêts, de passe-temps et d'activités, ce qui peut se refléter dans une certaine mesure dans la variété des sujets abordés sur ce site web.