Skambinimas AIF dokumentų tarnyboms tiesiai iš X++ naudojant Dynamics AX 2012
Paskelbta: 2025 m. vasario 16 d. 11:23:04 UTC
Šiame straipsnyje paaiškinu, kaip iškviesti „Dynamics AX 2012“ programų integravimo pagrindų dokumentų tarnybas tiesiai iš X++ kodo, emuliuojant tiek gaunamus, tiek išeinančius skambučius, o tai gali žymiai palengvinti AIF kodo klaidų paiešką ir derinimą.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Šiame įraše pateikta informacija pagrįsta Dynamics AX 2012 R3. Jis gali galioti arba negalioja kitoms versijoms.
Neseniai padėjau klientui įdiegti taikomųjų programų integravimo sistemos (AIF) įeinantį prievadą, kad sukurtų klientus pagal duomenis, kuriuos jie gauna iš kitos sistemos. Kadangi „Dynamics AX“ jau teikia „CustCustomer“ dokumentų paslaugą, kuri įgyvendina to logiką, nusprendėme, kad tai būtų paprasta ir naudosime standartinį sprendimą.
Tačiau netrukus paaiškėjo, kad iškilo daug problemų norint, kad išorinė sistema generuotų XML, kurį priimtų Dynamics AX. „Dynamics AX“ sukurta XML schema yra gana sudėtinga, be to, atrodo, kad „Dynamics AX“ yra keletas klaidų, dėl kurių ji kartais atmeta XML, kuris galioja pagal kitus įrankius, todėl apskritai ji pasirodė ne tokia paprasta, nei aš maniau.
Vykdydamas pastangas, man dažnai buvo sunku išsiaiškinti, kokia tiksliai yra tam tikrų XML failų problema, nes AIF pateikiami klaidų pranešimai yra ne tokie informatyvūs. Tai taip pat buvo nuobodu, nes turėjau palaukti, kol išorinė sistema išsiųs naują pranešimą per MSMQ, o tada dar kartą, kol AIF pasiims pranešimą ir jį apdoros, kol galėjau pamatyti klaidą.
Todėl ištyriau, ar galima iškviesti paslaugos kodą tiesiogiai naudojant vietinį XML failą, kad būtų galima greičiau išbandyti, ir paaiškėjo, kad taip yra – ir negana to, tai tikrai paprasta padaryti ir iš tikrųjų pateikia daug prasmingesnių klaidų pranešimų.
Toliau pateiktame pavyzdiniame užduotyje nuskaitomas vietinis XML failas ir bandoma jį naudoti su AxdCustomer klase (kuri yra „CustCustomer“ tarnybos naudojama dokumentų klasė), kad sukurtų klientą. Jei reikia, galite atlikti 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');
}
Objekte AifEntityKey, kurį grąžino metodas customer.create() (kuris atitinka AIF paslaugos „kurti“ operaciją), yra informacijos apie tai, kuris klientas buvo sukurtas, be kita ko, sukurto CustTable įrašo RecId.
Jei bandote patikrinti išeinantį prievadą arba jums tiesiog reikia pavyzdžio, kaip XML turėtų atrodyti įeinančiame prievade, taip pat galite naudoti dokumento klasę, kad eksportuotumėte klientą į failą, vietoj to iškviesdami read() metodą (atitinkantį „skaitymo“ paslaugos operaciją), pavyzdžiui:
{
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, turėtumėte pakeisti „123456“ kliento, kurį norite perskaityti, sąskaitos numeriu.