Miklix

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.


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 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.

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 „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:

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');
}

Mali by ste samozrejme nahradiť '123456' číslom účtu zákazníka, ktorý si chcete prečítať.

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

Mikkel Bang Christensen

O autorovi

Mikkel Bang 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.