Miklix

Виклик служб документообігу 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, якщо вам це потрібно.

static void CustomerCreate(Args _args)
{
    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"), Ось так:

static void CustomerRead(Args _args)
{
    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» на номер рахунку клієнта, якого ви хочете прочитати.

Поділитися на BlueskyПоділіться на FacebookПоділіться на LinkedInПоділіться на TumblrПоділитися на XПоділіться на LinkedInЗакріпити на Pinterest

Міккель Банг Крістенсен

Про автора

Міккель Банг Крістенсен
Міккель - творець і власник сайту miklix.com. Він має понад 20 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.