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
Poslední aktualizace: 12. ledna 2026 v 8:55:10 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++, emulovat příchozí i odchozí volání, což může výrazně usnadnit vyhledává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 aplikaci Dynamics AX 2012 R3. Pro jiné verze mohou, ale nemusí být platné.

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á implementuje logiku pro tento účel, rozhodli jsme se pro zjednodušení a použití standardního řešení.

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

Během tohoto úsilí jsem se často potýkal s tím, jaký přesně byl problém s určitými XML soubory, protože chybové zprávy poskytované AIF nebyly dostatečně informativní. Bylo to také zdlouhavé, protože jsem musel čekat, až externí systém odešle novou zprávu přes MSMQ, a pak znovu, až AIF zprávu přijme a zpracuje, než jsem viděl chybu.

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

Níže uvedený příklad úlohy 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. Podobné úlohy můžete v případě potřeby vytvořit i 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() (která odpovídá operaci služby „create“ v AIF) obsahuje informace o tom, který zákazník byl vytvořen, mimo jiné RecId vytvořeného záznamu CustTable.

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

Samozřejmě byste měli nahradit „123456“ číslem účtu zákazníka, od kterého chcete údaje přečíst.

Další čtení

Pokud se vám tento příspěvek líbil, mohly by se vám líbit i tyto návrhy:


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

Mikkel Christensen

O autorovi

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