Appel des services de documents AIF directement depuis X++ dans Dynamics AX 2012
Publié : 16 février 2025 à 11 h 26 min 31 s UTC
Dernière mise à jour : 12 janvier 2026 à 08 h 55 min 47 s UTC
Dans cet article, j’explique comment appeler les services de documents du Cadre d’intégration d’applications dans Dynamics AX 2012 directement à partir du code X++, en émulant à la fois les appels entrants et sortants, ce qui peut rendre beaucoup plus facile la détection et le débogage des erreurs dans le code AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Les informations contenues dans ce billet sont basées sur le Dynamics AX 2012 R3. Cela peut être valide ou non pour d’autres versions.
J’ai récemment aidé un client à implémenter un port entrant du Cadre d’Intégration d’Applications (AIF) pour créer des clients à partir 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 cela simple et d’utiliser la solution standard.
Cependant, il s’est vite avéré qu’il y avait beaucoup de problèmes pour faire générer XML par le système externe que Dynamics AX acceptait. Le schéma XML généré par Dynamics AX est assez complexe et il semble aussi qu’il y ait quelques bogues dans Dynamics AX qui le font parfois rejeter un XML valide selon d’autres outils, donc dans l’ensemble, il s’est avéré moins simple que je ne le pensais.
Pendant cette tâche, j’ai souvent eu du mal à comprendre exactement quel était le problème avec certains fichiers XML parce que les messages d’erreur fournis par l’AIF sont peu informatifs. C’était aussi fastidieux, car je devais attendre que le système externe envoie un nouveau message via MSMQ, puis que l’AIF récupère le message et le traite avant de voir une erreur.
J’ai donc étudié s’il était possible d’appeler le code du service directement avec un fichier XML local pour des tests un peu plus rapides, et il s’avère que oui — et non seulement cela, c’est vraiment simple à faire et fournit en fait des messages d’erreur beaucoup plus 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 document utilisée par le service CustCustomer ) pour créer un client. Tu peux créer des tâches similaires pour toutes les autres classes de documents, par exemple AxdSalesOrder, si tu en as besoin.
{
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 retourné par la méthode customer.create() (qui correspond à l’opération « create » service dans AIF) contient des informations sur le client 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 comment le XML devrait ressembler sur le port entrant, vous pouvez aussi utiliser la classe document pour exporter un client vers un fichier en appelant la méthode read() (correspondant à l’opération de service « read ») à la place, Comme ceci :
{
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 devriez bien sûr remplacer « 123456 » par le numéro de compte du client que vous souhaitez lire.
Lectures complémentaires
Si vous avez apprécié cet article, vous aimerez peut-être aussi ces suggestions :
- Aperçu rapide de Dynamics AX 2012 SysOperation Framework
- Utilisation d'une requête dans une classe de contrat de données SysOperation dans Dynamics AX 2012
- Utilisation du cadre SysExtension pour savoir quelle sous-classe instancier dans Dynamics AX 2012
