Miklix

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

Објавено: 5 март 2025, во 19:53:58 UTC

Во оваа статија, објаснувам како да ги повикате услугите за документи за рамка за интеграција на апликации во Dynamics AX 2012 директно од кодот X++, емулирајќи ги и влезните и излезните повици, што може значително да го олесни наоѓањето и отстранувањето грешки во AIF кодот.


Оваа страница беше машински преведена од англиски за да биде достапна за што повеќе луѓе. За жал, машинското преведување сè уште не е усовршена технологија, така што може да се појават грешки. Ако сакате, можете да ја видите оригиналната англиска верзија овде:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Информациите во овој пост се засноваат на Dynamics AX 2012 R3. Може или не може да важи за други верзии.

Неодамна му помагав на клиентот да имплементира влезна порта за рамка за интеграција на апликации (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Споделете на ФејсбукСподелете на LinkedInСподелете на TumblrСподелете на XСподелете на LinkedInЗакачи на Pinterest

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

За авторот

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