Извикване на AIF Document Services директно от X++ в Dynamics AX 2012
Публикувано: 16 февруари 2025 г. в 11:22:51 ч. 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() (който съответства на операцията на услугата „създаване“ в AIF) съдържа информация за това кой клиент е създаден, наред с други неща RecId на създадения запис CustTable.
Ако това, което се опитвате да тествате, вместо това е изходящ порт или ако просто се нуждаете от пример за това как трябва да изглежда XML на входящия порт, можете също да използвате класа на документа, за да експортирате клиент във файл вместо това, като извикате метода 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“ с номера на сметката на клиента, който искате да прочетете.