Miklix

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.


Diese Seite wurde maschinell aus dem Englischen übersetzt, um sie so vielen Menschen wie möglich zugänglich zu machen. Leider ist die maschinelle Übersetzung noch keine ausgereifte Technologie, so dass Fehler auftreten können. Wenn Sie es vorziehen, können Sie sich die englische Originalversion hier ansehen:

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“.

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');
}

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:

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');
}

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:


Teilen auf BlueskyAuf Facebook teilenAuf LinkedIn teilenAuf Tumblr teilenTeilen auf XAuf LinkedIn teilenPin auf Pinterest

Mikkel Christensen

Über den Autor

Mikkel Christensen
Mikkel ist der Schöpfer und Eigentümer von miklix.com. Er verfügt über mehr als 20 Jahre Erfahrung als professioneller Computerprogrammierer/Softwareentwickler und ist derzeit in Vollzeit für ein großes europäisches IT-Unternehmen tätig. Wenn er nicht gerade bloggt, verbringt er seine Freizeit mit einer Vielzahl von Interessen, Hobbys und Aktivitäten, was sich bis zu einem gewissen Grad in der Vielfalt der auf dieser Website behandelten Themen widerspiegelt.