Miklix

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

Publié : 16 février 2025 à 11:22:58 UTC

Dans cet article, j'explique comment appeler les services de document 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 ou non être valables pour d'autres versions.

J'ai récemment aidé un client à mettre en œuvre un port entrant AIF (Application Integration Framework) pour créer des clients en fonction des données qu'il recevait d'un autre système. Comme Dynamics AX fournit déjà le service de document CustCustomer, qui implémente la logique pour cela, nous avons décidé de garder les choses simples et d'utiliser la solution standard.

Cependant, il s'est rapidement avéré qu'il y avait beaucoup de problèmes pour que le système externe génère du XML que Dynamics AX accepterait. Le schéma XML généré par Dynamics AX est assez complexe et il semble également y avoir quelques bugs dans Dynamics AX qui l'amènent parfois à rejeter du XML qui est valide selon d'autres outils. Dans l'ensemble, cela s'est donc avéré moins simple que je ne le pensais.

Au cours de cette opération, j'ai souvent eu du mal à déterminer le problème exact de certains fichiers XML, car les messages d'erreur fournis par AIF sont peu informatifs. C'était également fastidieux, car je devais attendre que le système externe envoie un nouveau message via MSMQ, puis qu'AIF récupère le message et le traite avant de pouvoir voir une erreur.

J'ai donc étudié s'il était possible d'appeler le code de service directement avec un fichier XML local pour des tests un peu plus rapides et il s'avère que c'est le cas - et non seulement cela, c'est vraiment simple à faire et fournit en fait beaucoup plus de messages d'erreur significatifs.

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 vous en avez besoin.

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 qui a été créé, entre autres le RecId de l'enregistrement CustTable créé.

Si ce que vous essayez de tester est plutôt un port sortant ou si vous avez simplement besoin d'un exemple de ce à quoi le XML devrait ressembler sur le port entrant, vous pouvez également utiliser la classe de document pour exporter un client vers un fichier à la place en appelant la méthode read() (correspondant à l'opération de service « lecture ») à la place, 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 que vous souhaitez lire.

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

Mikkel Bang Christensen

A propos de l'auteur

Mikkel Bang 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.