Volanie dokumentových služieb AIF priamo z X++ v Dynamics AX 2012
Publikované: 16. februára 2025 o 11:23:13 UTC
V tomto článku vysvetľujem, ako volať služby dokumentov Application Integration Framework v Dynamics AX 2012 priamo z kódu X++, emulujúc 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 Dynamics AX 2012 R3. Môže a nemusí platiť 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é dostávali z iného systému. Keďže Dynamics AX už poskytuje dokumentovú službu CustCustomer, ktorá na to implementuje logiku, rozhodli sme sa, že to bude jednoduché a použijeme štandardné riešenie.
Čoskoro sa však ukázalo, že existuje veľa problémov s tým, aby externý systém vygeneroval XML, ktorý by Dynamics AX akceptoval. Schéma XML generovaná Dynamics AX je pomerne zložitá a tiež sa zdá, že v Dynamics AX je málo chýb, ktoré niekedy spôsobujú, že odmieta XML, ktorý je platný pre schému podľa iných nástrojov, takže celkovo sa ukázalo, že je to menej jednoduché, ako som si myslel.
Počas tohto úsilia som sa často snažil zistiť, v čom presne je problém s určitými súbormi XML, pretože chybové hlásenia poskytované AIF sú menej než informatívne. Bolo to tiež únavné, pretože som musel čakať, kým externý systém odošle novú správu cez MSMQ a potom znova, kým AIF správu vyzdvihne a spracuje, kým sa mi zobrazí chyba.
Skúmal som preto, či je možné volať servisný kód priamo s lokálnym súborom XML pre o niečo rýchlejšie testovanie a ukázalo sa, že áno – a nielen to, je to naozaj jednoduché a v skutočnosti poskytuje oveľa zmysluplnejšie chybové hlásenia.
Príklad úlohy nižšie 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. V prípade potreby môžete urobiť podobné úlohy 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 „vytvoriť“ v AIF) obsahuje informácie o tom, ktorý zákazník bol vytvorený, okrem iného RecId vytvoreného záznamu CustTable.
Ak to, čo sa pokúšate otestovať, je výstupný port alebo ak potrebujete len príklad toho, ako by mal XML vyzerať na vstupnom porte, môžete tiež použiť triedu dokumentu na export zákazníka do súboru namiesto toho zavolaním metódy read() (zodpovedajúcej operácii služby „read“), napríklad 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');
}
Mali by ste samozrejme nahradiť '123456' číslom účtu zákazníka, ktorý si chcete prečítať.