Miklix

Извикване на 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, ако е необходимо.

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() (съответстващ на операцията за обслужване „четене“), ето така:

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Закачи в Пинтерест

Микел Кристенсен

За автора

Микел Кристенсен
Микел е създател и собственик на сайта miklix.com. Той има над 20 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.