Bel AIF-dokumentdienste direk vanaf X ++ in Dynamics AX 2012
Gepubliseer: 16 Februarie 2025 om 11:23:48 UTC
Laas opgedateer: 12 Januarie 2026 om 08:55:36 UTC
In hierdie artikel verduidelik ek hoe om Application Integration Framework-dokumentdienste in Dynamics AX 2012 direk vanaf X++-kode aan te roep, deur beide inkomende en uitgaande oproepe te emuleer, wat dit aansienlik makliker kan maak om foute in AIF-kode te vind en te ontfout.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Die inligting in hierdie plasing is gebaseer op Dynamics AX 2012 R3. Dit mag dalk geldig wees vir ander weergawes, maar ook nie.
Ek het onlangs 'n kliënt gehelp om 'n Toepassingsintegrasieraamwerk (AIF) inkomende poort te implementeer vir die skep van kliënte gebaseer op data wat hulle van 'n ander stelsel ontvang het. Aangesien Dynamics AX reeds die CustCustomer-dokumentdiens verskaf, wat die logika hiervoor implementeer, het ons besluit om dit eenvoudig te hou en die standaardoplossing te gebruik.
Dit het egter gou geblyk dat daar baie probleme was om die eksterne stelsel XML te laat genereer wat Dynamics AX sou aanvaar. Die XML-skema wat deur Dynamics AX gegenereer word, is nogal kompleks en dit blyk ook dat daar 'n paar foute in Dynamics AX is wat soms veroorsaak dat dit XML verwerp wat skema-geldig is volgens ander gereedskap, so oor die algemeen het dit minder eenvoudig geblyk te wees as wat ek gedink het.
Tydens die poging het ek dikwels gesukkel om uit te vind wat presies die probleem met sekere XML-lêers was, omdat die foutboodskappe wat deur AIF verskaf word, minder insiggewend is. Dit was ook vervelig, want ek moes wag vir die eksterne stelsel om 'n nuwe boodskap oor MSMQ te stuur en dan weer vir AIF om die boodskap op te tel en te verwerk voordat ek 'n fout kon sien.
Ek het dus ondersoek ingestel of dit moontlik is om die dienskode direk met 'n plaaslike XML-lêer aan te roep vir ietwat vinniger toetsing en dit blyk dat dit is - en nie net dit nie, dit is regtig eenvoudig om te doen en verskaf eintlik baie meer betekenisvolle foutboodskappe.
Die voorbeeldtaak hieronder lees 'n plaaslike XML-lêer en probeer dit saam met die AxdCustomer-klas (wat die dokumentklas is wat deur die CustCustomer-diens gebruik word) gebruik om 'n kliënt te skep. Jy kan soortgelyke take vir al die ander dokumentklasse maak, byvoorbeeld 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');
}
Die AifEntityKey-objek wat deur die customer.create()-metode teruggegee word (wat ooreenstem met die "create"-diensbewerking in AIF) bevat inligting oor watter kliënt geskep is, onder andere die RecId van die geskepte CustTable-rekord.
As jy eerder 'n Uitgaande poort wil toets, of as jy net 'n voorbeeld nodig het van hoe die XML op die Inkomende poort moet lyk, kan jy ook die dokumentklas gebruik om 'n kliënt na 'n lêer uit te voer deur die read()-metode (wat ooreenstem met die "lees"-diensbewerking) te gebruik, soos volg:
{
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');
}
Jy moet natuurlik '123456' vervang met die rekeningnommer van die kliënt wat jy wil lees.
Verdere Leeswerk
As jy hierdie plasing geniet het, sal jy dalk ook van hierdie voorstelle hou:
- Gebruik die SysExtension-raamwerk om uit te vind watter subklas in Dynamics AX 2012 geïnstalleer moet word
- Vee 'n Regsentiteit (Maatskappyrekeninge) in Dynamics AX 2012 uit
- Identifisering van dokumentklas en navraag vir AIF-diens in Dynamics AX 2012
