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.
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.
{
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:
{
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:
- Het verschil tussen data() en buf2Buf() in Dynamics AX 2012
- Stringopmaak met macro en strFmt in Dynamics AX 2012
- Een query gebruiken in een SysOperation Data Contract-klasse in Dynamics AX 2012
