Skambinimas AIF dokumentų tarnyboms tiesiai iš X++ naudojant Dynamics AX 2012
Paskelbta: 2025 m. vasario 16 d. 11:23:04 UTC
Paskutinį kartą atnaujinta: 2026 m. sausio 12 d. 08:55:17 UTC
Šiame straipsnyje paaiškinu, kaip iškviesti „Application Integration Framework“ dokumentų paslaugas „Dynamics AX 2012“ sistemoje tiesiai iš X++ kodo, emuliuojant tiek įeinančius, tiek išeinančius iškvietimus, o tai gali gerokai palengvinti klaidų paiešką ir derinimą AIF kode.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Šiame įraše pateikta informacija pagrįsta „Dynamics AX 2012 R3“. Ji gali tikti arba netikti kitoms versijoms.
Neseniai padėjau klientui įdiegti programų integravimo sistemos (AIF) įeinantį prievadą, skirtą klientams kurti remiantis duomenimis, kuriuos jie gauna iš kitos sistemos. Kadangi „Dynamics AX“ jau teikia „CustCustomer“ dokumentų paslaugą, kuri įgyvendina šios sistemos logiką, nusprendėme išlaikyti paprastumą ir naudoti standartinį sprendimą.
Tačiau netrukus paaiškėjo, kad kyla daug problemų bandant priversti išorinę sistemą sugeneruoti XML, kurį priimtų „Dynamics AX“. „Dynamics AX“ generuojama XML schema yra gana sudėtinga, be to, atrodo, kad joje yra keletas klaidų, dėl kurių ji kartais atmeta XML, kuris pagal kitus įrankius yra tinkamas schemai, taigi, apibendrinant, tai pasirodė esą ne taip paprasta, kaip maniau.
Šio darbo metu dažnai sunkiai sekėsi išsiaiškinti, kokia tiksliai yra tam tikrų XML failų problema, nes AIF pateikiami klaidų pranešimai nėra labai informatyvūs. Tai taip pat buvo varginantis procesas, nes turėjau laukti, kol išorinė sistema atsiųs naują pranešimą per MSMQ, o tada dar kartą, kol AIF jį priims ir apdoros, kol pamatysiu klaidą.
Todėl ištyriau, ar įmanoma tiesiogiai iškviesti paslaugos kodą naudojant vietinį XML failą, kad testavimas būtų šiek tiek greitesnis, ir paaiškėjo, kad taip – ir ne tik tai, tai padaryti labai paprasta ir iš tikrųjų pateikia daug prasmingesnius klaidų pranešimus.
Žemiau pateiktas pavyzdinis darbas nuskaito vietinį XML failą ir bando jį naudoti su „AxdCustomer“ klase (kuri yra „CustCustomer“ paslaugos naudojama dokumentų klasė), kad sukurtų klientą. Jei reikia, galite sukurti panašias užduotis visoms kitoms dokumentų klasėms, pavyzdžiui, „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');
}
„AifEntityKey“ objektas, kurį grąžina metodas customer.create() (kuris atitinka paslaugos kūrimo operaciją AIF), yra informacija apie tai, kuris klientas buvo sukurtas, be kita ko, sukurto „CustTable“ įrašo „RecId“.
Jei bandote patikrinti siunčiamąjį prievadą arba tiesiog norite pamatyti, kaip XML turėtų atrodyti gaunamajame prievade, galite naudoti dokumento klasę, kad eksportuotumėte klientą į failą, iškviesdami read() metodą (atitinkantį „skaityti“ paslaugos operaciją), taip:
{
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');
}
Žinoma, „123456“ turėtumėte pakeisti kliento, kurio duomenis norite perskaityti, sąskaitos numeriu.
Papildoma literatūra
Jei jums patiko šis įrašas, jums taip pat gali patikti šie pasiūlymai:
- Dynamics AX 2012 AIF paslaugos dokumento klasės ir užklausos identifikavimas
- „Dynamics AX 2012 SysOperation Framework“ greita apžvalga
- „SysExtension Framework“ naudojimas norint sužinoti, kurį poklasį reikia sukurti „Dynamics AX 2012“
