Miklix

AIF Document Services rechtstreeks vanuit X++ in Dynamics AX 2012 aanroepen

Gepubliceerd: 16 februari 2025 om 11:23:07 UTC
Laatst bijgewerkt: 12 januari 2026 om 08:55:19 UTC

In dit artikel leg ik uit hoe u Application Integration Framework-documentservices in Dynamics AX 2012 rechtstreeks vanuit X++-code kunt aanroepen, waarbij zowel inkomende als uitgaande aanroepen worden gesimuleerd. Dit kan het aanzienlijk eenvoudiger maken om fouten in AIF-code te vinden en op te sporen.


Deze pagina is machinaal uit het Engels vertaald om hem voor zoveel mogelijk mensen toegankelijk te maken. Helaas is machinevertaling nog geen geperfectioneerde technologie, dus er kunnen fouten optreden. Als je dat liever hebt, kun je hier de originele Engelse versie bekijken:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

De informatie in dit bericht is gebaseerd op Dynamics AX 2012 R3. Deze informatie is mogelijk niet geldig voor andere versies.

Onlangs hielp ik een klant met het implementeren van een Application Integration Framework (AIF) inbound-poort voor het aanmaken van klanten op basis van gegevens die ze uit een ander systeem ontvingen. Omdat Dynamics AX al de documentservice CustCustomer biedt, die de logica hiervoor implementeert, besloten we het simpel te houden en de standaardoplossing te gebruiken.

Het bleek echter al snel dat er veel problemen waren om het externe systeem XML te laten genereren die door Dynamics AX geaccepteerd werd. Het door Dynamics AX gegenereerde XML-schema is vrij complex en er lijken ook enkele bugs in Dynamics AX te zitten die er soms voor zorgen dat XML wordt afgewezen die volgens andere tools wel aan het schema voldoet. Al met al bleek het dus minder eenvoudig dan ik had gedacht.

Tijdens dit proces had ik vaak moeite om precies te achterhalen wat het probleem was met bepaalde XML-bestanden, omdat de foutmeldingen van AIF weinig informatief waren. Het was bovendien omslachtig, omdat ik moest wachten tot het externe systeem een nieuw bericht via MSMQ verstuurde en vervolgens weer tot AIF het bericht oppikte en verwerkte voordat ik een foutmelding kon zien.

Ik heb daarom onderzocht of het mogelijk is om de servicecode rechtstreeks aan te roepen met een lokaal XML-bestand voor snellere tests, en het blijkt dat dit inderdaad kan. Sterker nog, het is heel eenvoudig en levert bovendien veel betekenisvollere foutmeldingen op.

De onderstaande voorbeeldtaak leest een lokaal XML-bestand en probeert dit te gebruiken met de AxdCustomer-klasse (de documentklasse die door de CustCustomer-service wordt gebruikt) om een klant aan te maken. U kunt vergelijkbare taken maken voor alle andere documentklassen, bijvoorbeeld AxdSalesOrder, indien nodig.

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

Het AifEntityKey-object dat wordt geretourneerd door de customer.create()-methode (die overeenkomt met de "create"-servicebewerking in AIF) bevat informatie over welke klant is aangemaakt, waaronder de RecId van de aangemaakte CustTable-record.

Als je een uitgaande poort wilt testen of als je alleen een voorbeeld nodig hebt van hoe de XML er op de inkomende poort uit moet zien, kun je ook de documentklasse gebruiken om een klant naar een bestand te exporteren door in plaats daarvan de read()-methode aan te roepen (die overeenkomt met de servicebewerking "read"), zoals hieronder:

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

U dient '123456' uiteraard te vervangen door het rekeningnummer van de klant waarvan u de gegevens wilt inzien.

Verder lezen

Als je dit bericht leuk vond, vind je deze suggesties misschien ook interessant:


Delen op BlueskyDelen op FacebookDelen op LinkedInDelen op TumblrDelen op XDelen op LinkedInPin op Pinterest

Mikkel Christensen

Over de auteur

Mikkel Christensen
Mikkel is de bedenker en eigenaar van miklix.com. Hij heeft meer dan 20 jaar ervaring als professioneel computerprogrammeur/softwareontwikkelaar en werkt momenteel fulltime voor een groot Europees IT-bedrijf. Als hij niet blogt, besteedt hij zijn vrije tijd aan een breed scala aan interesses, hobby's en activiteiten, die tot op zekere hoogte weerspiegeld kunnen worden in de verscheidenheid aan onderwerpen op deze website.