Miklix

Повикување на AIF Document Services директно од X++ во Dynamics AX 2012

Објавено: 5 март 2025, во 19:53:58 UTC
Последно ажурирано: 12 јануари 2026, во 08:55:45 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Споделете на ФејсбукСподелете на LinkedInСподелете на TumblrСподелете на XСподелете на LinkedInЗакачи на Pinterest

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

За авторот

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