AIF-i dokumenditeenustele helistamine otse rakendusest X++ rakenduses Dynamics AX 2012
Avaldatud: 16. veebruar 2025, kell 11:22:56 UTC
Selles artiklis selgitan, kuidas kutsuda Dynamics AX-i 2012 rakenduse integratsiooniraamistiku dokumenditeenuseid otse X++ koodist, emuleerides nii sissetulevaid kui ka väljaminevaid kõnesid, mis võib oluliselt hõlbustada AIF-i koodis vigade leidmist ja silumist.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Selles postituses olev teave põhineb Dynamics AX-i 2012 R3-l. See võib teiste versioonide jaoks kehtida, kuid ei pruugi kehtida.
Aitasin hiljuti ühel kliendil rakendada rakenduste integreerimise raamistiku (AIF) sissetulevat porti, et luua kliente teisest süsteemist saadud andmete põhjal. Kuna Dynamics AX pakub juba dokumentide teenust CustCustomer, mis rakendab selle loogika, otsustasime jätta selle lihtsaks ja kasutada standardlahendust.
Peagi aga selgus, et välissüsteemi Dynamics AX-iga aktsepteeritava XML-i genereerimiseks oli palju probleeme. Dynamics AX-i loodud XML-skeem on üsna keeruline ja tundub, et Dynamics AX-is on vähe vigu, mis mõnikord põhjustavad selle XML-i tagasilükkamise, mis on muude tööriistade järgi skeemiga kehtiv, nii et kokkuvõttes osutus see vähem lihtsaks, kui ma arvasin.
Ettevõtmise ajal oli mul sageli raskusi, et aru saada, mis probleem teatud XML-failidega täpselt oli, sest AIF-i veateated on vähem informatiivsed. See oli ka tüütu, sest pidin ootama, kuni väline süsteem saadab MSMQ kaudu uue sõnumi ja siis uuesti, et AIF sõnumi üles korjaks ja seda töötleks, enne kui ma tõrget näen.
Seetõttu uurisin, kas on võimalik kutsuda teeninduskoodi otse kohaliku XML-failiga, et testida mõnevõrra kiiremini, ja selgus, et see on nii – ja mitte ainult, seda on tõesti lihtne teha ja see annab tegelikult palju sisukamaid veateateid.
Allolev näidistöö loeb kohalikku XML-faili ja proovib seda kliendi loomiseks kasutada koos klassiga AxdCustomer (see on klienditeeninduses kasutatav dokumendiklass). Vajadusel saate teha sarnaseid töid kõigi teiste dokumendiklasside jaoks, näiteks AxdSalesOrder.
{
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');
}
Meetodi customer.create() poolt tagastatud objekt AifEntityKey (mis vastab AIF-is teenuse "loo" toimingule) sisaldab teavet selle kohta, milline klient loodi, muu hulgas loodud CustTable-kirje RecID-d.
Kui proovite testida hoopis väljaminevat porti või kui vajate lihtsalt näidet selle kohta, kuidas XML peaks sissetulevas pordis välja nägema, saate selle asemel kasutada kliendi faili eksportimiseks dokumendiklassi, kutsudes selle asemel välja meetodi read() (mis vastab teenuse "loe" toimingule), näiteks järgmiselt:
{
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');
}
Loomulikult peaksite asendama '123456' selle kliendi kontonumbriga, keda soovite lugeda.