Miklix

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.


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

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 (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:

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

Natürlich sollten Sie „123456“ durch die Kontonummer des Kunden ersetzen, den Sie auslesen möchten.

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

Mikkel Bang Christensen

Über den Autor

Mikkel Bang 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.