Miklix

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

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() (който съответства на операцията на услугата „създаване“ в AIF) съдържа информация за това кой клиент е създаден, наред с други неща RecId на създадения запис CustTable.

Ако това, което се опитвате да тествате, вместо това е изходящ порт или ако просто се нуждаете от пример за това как трябва да изглежда XML на входящия порт, можете също да използвате класа на документа, за да експортирате клиент във файл вместо това, като извикате метода 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 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.