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