Miklix

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

Објављено: 16. фебруар 2025. 11:25:48 UTC

У овом чланку објашњавам како да позовете услуге документа Апплицатион Интегратион Фрамеворк у Динамицс АКС 2012 директно из Кс++ кода, емулирајући и долазне и одлазне позиве, што може знатно олакшати проналажење и отклањање грешака у АИФ коду.


Ова страница је машински преведена са енглеског како би била доступна што већем броју људи. Нажалост, машинско превођење још увек није усавршена технологија, тако да може доћи до грешака. Ако желите, можете погледати оригиналну енглеску верзију овде:

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

Информације у овом посту су засноване на Динамицс АКС 2012 Р3. Може, али и не мора бити важеће за друге верзије.

Недавно сам помагао клијенту да имплементира улазни порт оквира за интеграцију апликација (АИФ) за креирање клијената на основу података које су примали из другог система. Пошто Динамицс АКС већ пружа услугу докумената ЦустЦустомер, која имплементира логику за ово, одлучили смо да остане једноставно и користи стандардно решење.

Међутим, убрзо се испоставило да постоји много проблема да се спољни систем генерише КСМЛ који би Динамицс АКС прихватио. КСМЛ шема коју генерише Динамицс АКС је прилично сложена и такође се чини да има неколико грешака у Динамицс АКС-у које понекад доводе до тога да одбије КСМЛ који је валидан за шему према другим алатима, тако да се све у свему показало мање једноставним него што сам мислио.

Током овог подухвата, често сам се мучио да схватим у чему је тачно проблем са одређеним КСМЛ датотекама јер су поруке о грешци које пружа АИФ мање него информативне. Такође је било заморно, јер сам морао да чекам да спољни систем пошаље нову поруку преко МСМК-а, а затим поново да АИФ преузме поруку и обради је пре него што сам могао да видим грешку.

Стога сам истражио да ли је могуће позвати сервисни код директно са локалном КСМЛ датотеком за нешто брже тестирање и показало се да јесте – и не само то, то је заиста једноставно за урадити и заправо пружа много значајније поруке о грешци.

Пример посла испод чита локалну КСМЛ датотеку и покушава да је користи са класом АкдЦустомер (која је класа документа коју користи услуга ЦустЦустомер) за креирање клијента. Можете направити сличне послове за све друге класе докумената, на пример АкдСалесОрдер, ако вам је потребно.

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');
}

Објекат АифЕнтитиКеи који је вратио метод цустомер.цреате() (који одговара операцији услуге "креирај" у АИФ-у) садржи информације о томе који клијент је креиран, између осталог РецИд креираног записа ЦустТабле.

Ако је оно што покушавате да тестирате излазни порт или ако вам је потребан само пример како би КСМЛ требало да изгледа на улазном порту, можете користити и класу документа да извезете клијента у датотеку уместо тога позивањем методе реад() (која одговара операцији услуге „читај“), на следећи начин:

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 година искуства као професионални компјутерски програмер/програмер софтвера и тренутно је запослен са пуним радним временом у великој европској ИТ корпорацији. Када не пише блог, своје слободно време проводи на широком спектру интересовања, хобија и активности, што се у извесној мери може одразити на разноврсност тема обрађених на овој веб страници.