Miklix

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.


Táto stránka bola strojovo preložená z angličtiny, aby bola prístupná čo najväčšiemu počtu ľudí. Žiaľ, strojový preklad ešte nie je dokonalá technológia, takže sa môžu vyskytnúť chyby. Ak chcete, môžete si pozrieť pôvodnú anglickú verziu tu:

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.

static void CustomerCreate(Args _args)
{
    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:

static void CustomerRead(Args _args)
{
    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:


Zdieľať na BlueskyZdieľať na FacebookuZdieľať na LinkedInZdieľať na TumblrZdieľať na XZdieľať na LinkedInPripnúť na Pintereste

Mikkel Christensen

O autorovi

Mikkel Christensen
Mikkel je tvorcom a majiteľom miklix.com. Má viac ako 20 rokov skúseností ako profesionálny počítačový programátor/vývojár softvéru a v súčasnosti pracuje na plný úväzok pre veľkú európsku IT korporáciu. Keď práve nepíše blog, venuje svoj voľný čas širokej škále záujmov, koníčkov a aktivít, čo sa môže do istej miery odrážať v rôznorodosti tém na tejto webovej lokalite.