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