Miklix

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

Gepubliceerd: 16 februari 2025 om 11:23:07 UTC

In dit artikel leg ik uit hoe u Application Integration Framework-documentservices in Dynamics AX 2012 rechtstreeks vanuit X++-code kunt aanroepen. Hiermee emuleer ik zowel inkomende als uitgaande aanroepen. Hierdoor kunt u veel eenvoudiger fouten in AIF-code vinden en opsporen.


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. Het kan wel of niet geldig zijn voor andere versies.

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

Maar al snel bleek dat er veel problemen waren om het externe systeem XML te laten genereren die Dynamics AX zou accepteren. Het XML-schema dat door Dynamics AX wordt gegenereerd, is vrij complex en het lijkt erop dat er ook een paar bugs in Dynamics AX zitten die er soms voor zorgen dat XML wordt afgewezen die schema-geldig is volgens andere tools, dus al met al bleek het minder eenvoudig te zijn dan ik had gedacht.

Tijdens de onderneming worstelde ik vaak om erachter te komen wat het probleem precies was met bepaalde XML-bestanden, omdat de foutmeldingen die AIF gaf niet bepaald informatief waren. Het was ook vervelend, omdat ik moest wachten tot het externe systeem een nieuw bericht via MSMQ stuurde en vervolgens weer tot AIF het bericht oppikte en verwerkte voordat ik een fout kon zien.

Daarom heb ik onderzocht of het mogelijk is om de servicecode rechtstreeks aan te roepen met een lokaal XML-bestand, zodat de tests sneller kunnen worden uitgevoerd. Dat blijkt te kunnen. Bovendien is het heel eenvoudig om te doen en levert het ook veel zinvollere foutmeldingen op.

De voorbeeldtaak hieronder leest een lokaal XML-bestand en probeert het te gebruiken met de AxdCustomer-klasse (de documentklasse die wordt gebruikt door de CustCustomer-service) om een klant te maken. U kunt soortgelijke taken maken voor alle andere documentklassen, bijvoorbeeld AxdSalesOrder, als u dat nodig hebt.

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 servicebewerking 'create' in AIF) bevat informatie over welke klant is aangemaakt, waaronder de RecId van de gemaakte CustTable-record.

Als u in plaats daarvan een uitgaande poort wilt testen of als u alleen een voorbeeld nodig hebt van hoe de XML eruit zou moeten zien op de inkomende poort, kunt u ook de documentklasse gebruiken om een klant naar een bestand te exporteren door de read()-methode aan te roepen (die overeenkomt met de servicebewerking 'read'), zoals hier:

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

Uiteraard vervangt u '123456' door het rekeningnummer van de klant die u wilt uitlezen.

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

Mikkel Bang Christensen

Over de auteur

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