AIF Document Services direkt aus X++ in Dynamics AX 2012 aufrufen
Veröffentlicht: 16. Februar 2025 um 11:22:53 UTC
Zuletzt aktualisiert: 12. Januar 2026 um 08:55:11 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 vereinfachen kann.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Die Informationen in diesem Beitrag basieren auf Dynamics AX 2012 R3. Ob sie auch für andere Versionen gelten, ist ungewiss.
Kürzlich unterstützte ich einen Kunden bei der Implementierung eines AIF-Eingangsports (Application Integration Framework) zur Kundenerstellung auf Basis von Daten aus einem anderen System. Da Dynamics AX bereits den Dokumentendienst „CustCustomer“ bereitstellt, der die entsprechende Logik implementiert, entschieden wir uns für eine einfache Standardlösung.
Es stellte sich jedoch schnell 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 XML abgelehnt wird, das laut anderen Tools schema-gültig ist. Alles in allem erwies es sich also als weniger einfach als erwartet.
Während des Projekts hatte ich oft Schwierigkeiten, die genaue Ursache des Problems mit bestimmten XML-Dateien zu ermitteln, da die Fehlermeldungen von AIF wenig aussagekräftig waren. Es war zudem mühsam, da ich warten musste, bis das externe System eine neue Nachricht über MSMQ sendete und AIF diese dann verarbeitete, bevor ich eine Fehlermeldung sehen konnte.
Ich habe daher untersucht, ob es möglich ist, den Servicecode direkt mit einer lokalen XML-Datei aufzurufen, um die Tests etwas zu beschleunigen, und es stellte sich heraus, dass dies möglich ist – und nicht nur das, es ist auch ganz einfach und liefert deutlich aussagekräftigere Fehlermeldungen.
Der folgende Beispieljob liest eine lokale XML-Datei und versucht, diese zusammen mit der Klasse „AxdCustomer“ (der Dokumentklasse des Dienstes „CustCustomer“) zu verwenden, um einen Kunden anzulegen. Bei Bedarf können Sie ähnliche Jobs für alle anderen Dokumentklassen erstellen, beispielsweise für „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 (das der "create"-Dienstoperation in AIF entspricht) enthält unter anderem Informationen darüber, welcher Kunde erstellt wurde, sowie die RecId des erstellten CustTable-Datensatzes.
Wenn Sie stattdessen einen ausgehenden Port testen möchten oder einfach nur ein Beispiel dafür benötigen, wie das XML auf dem eingehenden Port aussehen sollte, können Sie auch die Dokumentklasse verwenden, um einen Kunden in eine Datei zu exportieren, indem Sie stattdessen die Methode read() (entsprechend der Dienstoperation "read") aufrufen, 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');
}
Sie sollten selbstverständlich „123456“ durch die Kontonummer des Kunden ersetzen, dessen Daten Sie auslesen möchten.
Weitere Informationen
Wenn Ihnen dieser Beitrag gefallen hat, könnten Ihnen auch diese Vorschläge gefallen:
- Dynamics AX 2012 SysOperation Framework - Kurzübersicht
- So iterieren Sie über die Elemente einer Enumeration aus X++-Code in Dynamics AX 2012
- Stringformatierung mit Makro und strFmt in Dynamics AX 2012
