Volanie dokumentových služieb AIF priamo z X++ v Dynamics AX 2012
Publikované: 16. februára 2025 o 11:23:13 UTC
Posledná aktualizácia: 12. januára 2026 o 8:55:23 UTC
V tomto článku vysvetľujem, ako volať služby dokumentov Application Integration Framework v systéme Dynamics AX 2012 priamo z kódu X++, pričom emulujem prichádzajúce aj odchádzajúce volania, čo môže výrazne uľahčiť vyhľadávanie a ladenie chýb v kóde AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Informácie v tomto príspevku sú založené na systéme Dynamics AX 2012 R3. Môžu, ale nemusia byť platné aj pre iné verzie.
Nedávno som pomáhal zákazníkovi implementovať vstupný port Application Integration Framework (AIF) na vytváranie zákazníkov na základe údajov, ktoré prijímali z iného systému. Keďže Dynamics AX už poskytuje dokumentovú službu CustCustomer, ktorá implementuje logiku pre tento účel, rozhodli sme sa pre zjednodušenie a použiť štandardné riešenie.
Čoskoro sa však ukázalo, že existuje veľa problémov s tým, aby externý systém generoval XML, ktorý by systém Dynamics AX akceptoval. Schéma XML generovaná systémom Dynamics AX je pomerne zložitá a zdá sa, že v systéme Dynamics AX existuje aj niekoľko chýb, ktoré niekedy spôsobujú odmietnutie XML, ktoré je podľa iných nástrojov platné z hľadiska schémy, takže celkovo sa to ukázalo byť menej jednoduché, ako som si myslel.
Počas tohto úsilia som mal často problém zistiť, v čom presne bol problém s určitými XML súbormi, pretože chybové hlásenia poskytované systémom AIF neboli dostatočne informatívne. Bolo to tiež zdĺhavé, pretože som musel čakať, kým externý systém odošle novú správu cez MSMQ a potom znova, kým systém AIF správu prijme a spracuje, kým som si nevšimol chybu.
Preto som skúmal, či je možné volať servisný kód priamo pomocou lokálneho súboru XML pre o niečo rýchlejšie testovanie a ukázalo sa, že je - a nielen to, je to naozaj jednoduché a v skutočnosti to poskytuje oveľa zmysluplnejšie chybové hlásenia.
Nižšie uvedená príkladová úloha načíta lokálny súbor XML a pokúsi sa ho použiť s triedou AxdCustomer (čo je trieda dokumentov používaná službou CustCustomer) na vytvorenie zákazníka. Podobné úlohy môžete v prípade potreby vytvoriť aj pre všetky ostatné triedy dokumentov, napríklad 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');
}
Objekt AifEntityKey vrátený metódou customer.create() (ktorá zodpovedá operácii služby „create“ v AIF) obsahuje informácie o tom, ktorý zákazník bol vytvorený, okrem iného aj RecId vytvoreného záznamu CustTable.
Ak sa pokúšate otestovať odchádzajúci port alebo ak potrebujete len príklad toho, ako by mal XML vyzerať na prichádzajúcom porte, môžete na export zákazníka do súboru použiť aj triedu dokumentov volaním metódy read() (zodpovedajúcej operácii služby „read“) takto:
{
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');
}
Samozrejme, číslo „123456“ by ste mali nahradiť číslom účtu zákazníka, ktorého údaje chcete prečítať.
Ďalšie čítanie
Ak sa vám tento príspevok páčil, možno sa vám budú páčiť aj tieto návrhy:
- Ako iterovať cez prvky Enum z kódu X++ v Dynamics AX 2012
- Odstráňte právnickú osobu (firemné účty) v Dynamics AX 2012
- Preveďte real na reťazec so všetkými desatinnými miestami v Dynamics AX 2012
