Ringer til AIF Document Services direkte fra X++ i Dynamics AX 2012
Udgivet: 16. februar 2025 kl. 11.22.53 UTC
I denne artikel forklarer jeg, hvordan man kalder Application Integration Framework-dokumenttjenester i Dynamics AX 2012 direkte fra X++-kode, der emulerer både indgående og udgående opkald, hvilket kan gøre det væsentligt nemmere at finde og fejlfinde fejl i AIF-kode.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Oplysningerne i dette indlæg er baseret på Dynamics AX 2012 R3. Det er muligvis ikke gyldigt for andre versioner.
Jeg hjalp for nylig en kunde med at implementere en Application Integration Framework (AIF) indgående port til at oprette kunder baseret på data, de modtog fra et andet system. Da Dynamics AX allerede leverer CustomCustomer-dokumentservicen, som implementerer logikken for dette, besluttede vi at holde det enkelt og bruge standardløsningen.
Det viste sig dog hurtigt, at der var mange problemer med at få det eksterne system til at generere XML, som Dynamics AX ville acceptere. XML-skemaet, der genereres af Dynamics AX, er ret komplekst, og det ser også ud til, at der er få fejl i Dynamics AX, der nogle gange får det til at afvise XML, der er skema-gyldigt ifølge andre værktøjer, så alt i alt viste det sig at være mindre simpelt, end jeg havde troet.
Under bestræbelserne kæmpede jeg ofte med at finde ud af, hvad problemet præcist var med visse XML-filer, fordi fejlmeddelelserne fra AIF er mindre end informative. Det var også kedeligt, for jeg skulle vente på, at det eksterne system sendte en ny besked over MSMQ og så igen på, at AIF kunne hente beskeden og behandle den, før jeg kunne se en fejl.
Jeg har derfor undersøgt, om det er muligt at kalde servicekoden direkte med en lokal XML-fil til noget hurtigere test, og det viser sig, at det er det - og ikke nok med det, det er virkelig nemt at gøre og giver faktisk meget mere meningsfulde fejlmeddelelser.
Eksempelopgaven nedenfor læser en lokal XML-fil og forsøger at bruge den sammen med AxdCustomer-klassen (som er dokumentklassen, der bruges af CustomCustomer-tjenesten) til at oprette en kunde. Du kan lave lignende job til alle de andre dokumentklasser, for eksempel AxdSalesOrder, hvis du har brug for det.
{
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');
}
AifEntityKey-objektet returneret af customer.create()-metoden (som svarer til "create"-serviceoperationen i AIF) indeholder information om, hvilken kunde der blev oprettet, blandt andet RecId for den oprettede CustTable-post.
Hvis det, du prøver at teste, er en udgående port i stedet for, eller hvis du bare har brug for et eksempel på, hvordan XML'en skal se ud på den indgående port, kan du også bruge dokumentklassen til at eksportere en kunde til en fil i stedet ved at kalde read()-metoden (svarende til "read"-tjenesten) i stedet, som sådan:
{
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');
}
Du skal selvfølgelig erstatte '123456' med kontonummeret på den kunde, du ønsker at læse.