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.
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.
{
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:
{
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:
- Rychlý přehled Dynamics AX 2012 SysOperation Framework
- Identifikace třídy dokumentu a dotazu pro službu AIF v Dynamics AX 2012
- Formátování řetězce pomocí maker a strFmt v Dynamics AX 2012
