Miklix

Позивање АИФ Доцумент Сервицес директно са Кс++ у Динамицс АКС 2012

Објављено: 16. фебруар 2025. 11:25:48 UTC
Последње ажурирано: 12. јануар 2026. 08:55:42 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 требало да изгледа на долазном порту, можете користити и класу документа за извоз клијента у датотеку позивањем методе 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“ бројем рачуна клијента чији подаци желе да се очитају.

Даље читање

Ако сте уживали у овом посту, можда ће вам се свидети и ови предлози:


Поделите на БлуескиПоделите на ФејсбукуДелите на ЛинкедИнуПодели на Тумблр-уПодели на КсДелите на ЛинкедИнуПин на Пинтерест-у

Миккел Цхристенсен

О аутору

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