AIF Document Services direkt aus X++ in Dynamics AX 2012 aufrufen
Veröffentlicht: 16. Februar 2025 um 11:22:53 UTC
In diesem Artikel erkläre ich, wie man Application Integration Framework-Dokumentdienste in Dynamics AX 2012 direkt aus X++-Code aufruft und dabei sowohl eingehende als auch ausgehende Aufrufe emuliert, was das Auffinden und Debuggen von Fehlern im AIF-Code erheblich erleichtern kann.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Die Informationen in diesem Beitrag basieren auf Dynamics AX 2012 R3. Sie sind möglicherweise auch für andere Versionen gültig, müssen es aber nicht.
Ich habe kürzlich einem Kunden dabei geholfen, einen eingehenden Port für das Application Integration Framework (AIF) zu implementieren, um Kunden auf der Grundlage von Daten zu erstellen, die sie von einem anderen System erhalten. Da Dynamics AX bereits den CustCustomer-Dokumentendienst bereitstellt, der die Logik dafür implementiert, haben wir uns entschieden, es einfach zu halten und die Standardlösung zu verwenden.
Es stellte sich jedoch bald heraus, dass es viele Probleme gab, das externe System dazu zu bringen, XML zu generieren, das Dynamics AX akzeptieren würde. Das von Dynamics AX generierte XML-Schema ist recht komplex und es scheint auch einige Fehler in Dynamics AX zu geben, die manchmal dazu führen, dass es XML ablehnt, das laut anderen Tools schemagültig ist. Alles in allem erwies es sich also als weniger einfach, als ich gedacht hatte.
Während des Versuchs hatte ich oft Mühe, herauszufinden, was genau das Problem mit bestimmten XML-Dateien war, da die von AIF bereitgestellten Fehlermeldungen nicht sehr aussagekräftig waren. Es war auch mühsam, da ich warten musste, bis das externe System eine neue Nachricht über MSMQ sendete und dann erneut, bis AIF die Nachricht abholte und verarbeitete, bevor ich einen Fehler sehen konnte.
Ich habe daher untersucht, ob es möglich ist, den Servicecode zum etwas schnelleren Testen direkt mit einer lokalen XML-Datei aufzurufen, und es stellte sich heraus, dass dies möglich ist. Und nicht nur das, es ist wirklich einfach durchzuführen und liefert tatsächlich viel aussagekräftigere Fehlermeldungen.
Der folgende Beispieljob liest eine lokale XML-Datei und versucht, sie mit der Klasse AxdCustomer (das ist die vom Dienst CustCustomer verwendete Dokumentklasse) zu verwenden, um einen Kunden zu erstellen. Sie können bei Bedarf ähnliche Jobs für alle anderen Dokumentklassen erstellen, z. B. AxdSalesOrder.
{
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');
}
Das von der Methode customer.create() zurückgegebene AifEntityKey-Objekt (entspricht der Serviceoperation „create“ in AIF) enthält Informationen darüber, welcher Kunde erstellt wurde, unter anderem die RecId des erstellten CustTable-Datensatzes.
Wenn Sie stattdessen einen ausgehenden Port testen möchten oder nur ein Beispiel dafür benötigen, wie das XML auf dem eingehenden Port aussehen soll, können Sie auch die Dokumentklasse verwenden, um einen Kunden in eine Datei zu exportieren, indem Sie stattdessen die Methode read() (entspricht der Service-Operation „read“) aufrufen, und zwar wie folgt:
{
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');
}
Natürlich sollten Sie „123456“ durch die Kontonummer des Kunden ersetzen, den Sie auslesen möchten.