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.
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.
{
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 :
{
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 :
- Utilisation du framework SysExtension pour déterminer quelle sous-classe instancier dans Dynamics AX 2012
- La différence entre data() et buf2Buf() dans Dynamics AX 2012
- Utilisation d'une requête dans une classe de contrat de données SysOperation dans Dynamics AX 2012
