Miklix

Volání dokumentových služeb AIF přímo z X++ v Dynamics AX 2012

Vydáno: 16. února 2025 v 11:22:52 UTC

V tomto článku vysvětluji, jak volat služby dokumentů Application Integration Framework v Dynamics AX 2012 přímo z kódu X++, přičemž emuluji příchozí i odchozí volání, což může výrazně usnadnit hledání a ladění chyb v kódu AIF.


Tato stránka byla strojově přeložena z angličtiny, aby byla přístupná co největšímu počtu lidí. Strojový překlad bohužel ještě není dokonalá technologie, takže může dojít k chybám. Pokud si přejete, můžete si prohlédnout původní anglickou verzi zde:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Informace v tomto příspěvku jsou založeny na Dynamics AX 2012 R3. Může a nemusí platit pro jiné verze.

Nedávno jsem pomáhal zákazníkovi implementovat příchozí port Application Integration Framework (AIF) pro vytváření zákazníků na základě dat, která přijímali z jiného systému. Protože Dynamics AX již poskytuje dokumentovou službu CustCustomer, která k tomu implementuje logiku, rozhodli jsme se zachovat jednoduchost a použít standardní řešení.

Brzy se však ukázalo, že existuje mnoho problémů s tím, jak externí systém vygenerovat XML, který by Dynamics AX akceptoval. Schéma XML generované Dynamics AX je poměrně složité a také se zdá, že v Dynamics AX je málo chyb, které někdy způsobují, že odmítá XML, který je platný pro schéma podle jiných nástrojů, takže celkově se ukázalo, že je méně jednoduché, než jsem si myslel.

Během tohoto úsilí jsem se často snažil zjistit, v čem přesně je problém s určitými soubory XML, protože chybové zprávy poskytované AIF jsou méně než informativní. Bylo to také únavné, protože jsem musel čekat, až externí systém odešle novou zprávu přes MSMQ, a pak znovu, až AIF zprávu vyzvedne a zpracuje, než jsem viděl chybu.

Zkoumal jsem proto, zda je možné zavolat servisní kód přímo pomocí lokálního souboru XML pro poněkud rychlejší testování a ukázalo se, že ano – a nejen to, je to opravdu jednoduché a ve skutečnosti poskytuje mnohem smysluplnější chybové zprávy.

Níže uvedená ukázková úloha načte lokální soubor XML a pokusí se jej použít s třídou AxdCustomer (což je třída dokumentů používaná službou CustCustomer) k vytvoření zákazníka. V případě potřeby můžete vytvořit podobné úlohy pro všechny ostatní třídy dokumentů, napří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ácený metodou customer.create() (což odpovídá operaci „vytvoření“ služby v AIF) obsahuje informace o tom, který zákazník byl vytvořen, mimo jiné RecId vytvořeného záznamu CustTable.

Pokud se místo toho pokoušíte testovat odchozí port nebo pokud potřebujete pouze příklad toho, jak by měl XML vypadat na příchozím portu, můžete také použít třídu dokumentu k exportu zákazníka do souboru místo toho zavoláním metody read() (odpovídající operaci služby „čtení“), napří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');
}

Měli byste samozřejmě nahradit '123456' číslem účtu zákazníka, který si chcete přečíst.

Sdílet na BlueskySdílejte na FacebookuSdílet na LinkedInSdílet na TumblrSdílet na XSdílet na LinkedInPřipnout na Pinterest

Mikkel Bang Christensen

O autorovi

Mikkel Bang Christensen
Mikkel je tvůrcem a majitelem webu miklix.com. Má více než 20 let zkušeností jako profesionální programátor/vývojář softwaru a v současné době pracuje na plný úvazek pro velkou evropskou IT společnost. Pokud zrovna nepíše blog, věnuje svůj volný čas široké škále zájmů, koníčků a aktivit, což se může do jisté míry odrážet v rozmanitosti témat na tomto webu.