Извикване на AIF Document Services директно от X++ в Dynamics AX 2012
Публикувано: 16 февруари 2025 г. в 11:22:51 ч. UTC
Последна актуализация: 12 януари 2026 г. в 8:55:09 ч. UTC
В тази статия обяснявам как да извиквам услугите за документи на Application Integration Framework в Dynamics AX 2012 директно от X++ код, емулирайки както входящи, така и изходящи повиквания, което може значително да улесни намирането и отстраняването на грешки в AIF кода.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Информацията в тази публикация е базирана на Dynamics AX 2012 R3. Тя може да е валидна или да не е валидна за други версии.
Наскоро помагах на клиент да внедри входящ порт на Application Integration Framework (AIF) за създаване на клиенти въз основа на данни, получавани от друга система. Тъй като Dynamics AX вече предоставя услугата за документи CustCustomer, която реализира логиката за това, решихме да го опростим и да използваме стандартното решение.
Скоро обаче се оказа, че има много проблеми с генерирането на XML от външната система, който Dynamics AX би приел. XML схемата, генерирана от Dynamics AX, е доста сложна и изглежда, че има няколко грешки в Dynamics AX, които понякога карат системата да отхвърля XML, който е валиден по схема според други инструменти, така че като цяло се оказа, че не е толкова просто, колкото си мислех.
По време на начинанието често се затруднявах да разбера какъв точно е проблемът с определени XML файлове, защото съобщенията за грешки, предоставяни от AIF, не са особено информативни. Беше и досадно, защото трябваше да чакам външната система да изпрати ново съобщение през MSMQ и след това отново AIF да го приеме и обработи, преди да видя грешка.
Затова проучих дали е възможно да се извика сервизният код директно с локален XML файл за малко по-бързо тестване и се оказа, че е - и не само това, наистина е лесно да се направи и всъщност предоставя много по-смислени съобщения за грешки.
Примерната задача по-долу чете локален XML файл и се опитва да го използва с класа AxdCustomer (който е класът документи, използван от услугата CustCustomer), за да създаде клиент. Можете да създадете подобни задачи за всички останали класове документи, например 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');
}
Обектът AifEntityKey, върнат от метода customer.create() (който съответства на операцията за услуга „create“ в AIF), съдържа информация за това кой клиент е създаден, наред с други неща, RecId на създадения запис CustTable.
Ако това, което се опитвате да тествате, е изходящ порт или просто ви е необходим пример за това как трябва да изглежда XML на входящия порт, можете също да използвате класа document, за да експортирате клиент във файл, като извикате метода read() (съответстващ на операцията за обслужване „четене“), ето така:
{
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');
}
Разбира се, трябва да замените „123456“ с номера на сметката на клиента, който искате да прочетете.
Допълнително четене
Ако ви е харесала тази публикация, може да ви харесат и тези предложения:
- Форматиране на низове с Macro и strFmt в Dynamics AX 2012
- Използване на рамката SysExtension, за да разберете кой подклас да създадем в Dynamics AX 2012
- Преобразуване на реален в низ с всички десетични знаци в Dynamics AX 2012
