Виклик служб документообігу AIF безпосередньо з X++ у Dynamics AX 2012
Опубліковано: 16 лютого 2025 р. о 11:23:18 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() (що відповідає операції служби "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» на номер рахунку клієнта, якого ви хочете прочитати.