Позивање АИФ Доцумент Сервицес директно са Кс++ у Динамицс АКС 2012
Објављено: 16. фебруар 2025. 11:25:48 UTC
У овом чланку објашњавам како да позовете услуге документа Апплицатион Интегратион Фрамеворк у Динамицс АКС 2012 директно из Кс++ кода, емулирајући и долазне и одлазне позиве, што може знатно олакшати проналажење и отклањање грешака у АИФ коду.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Информације у овом посту су засноване на Динамицс АКС 2012 Р3. Може, али и не мора бити важеће за друге верзије.
Недавно сам помагао клијенту да имплементира улазни порт оквира за интеграцију апликација (АИФ) за креирање клијената на основу података које су примали из другог система. Пошто Динамицс АКС већ пружа услугу докумената ЦустЦустомер, која имплементира логику за ово, одлучили смо да остане једноставно и користи стандардно решење.
Међутим, убрзо се испоставило да постоји много проблема да се спољни систем генерише КСМЛ који би Динамицс АКС прихватио. КСМЛ шема коју генерише Динамицс АКС је прилично сложена и такође се чини да има неколико грешака у Динамицс АКС-у које понекад доводе до тога да одбије КСМЛ који је валидан за шему према другим алатима, тако да се све у свему показало мање једноставним него што сам мислио.
Током овог подухвата, често сам се мучио да схватим у чему је тачно проблем са одређеним КСМЛ датотекама јер су поруке о грешци које пружа АИФ мање него информативне. Такође је било заморно, јер сам морао да чекам да спољни систем пошаље нову поруку преко МСМК-а, а затим поново да АИФ преузме поруку и обради је пре него што сам могао да видим грешку.
Стога сам истражио да ли је могуће позвати сервисни код директно са локалном КСМЛ датотеком за нешто брже тестирање и показало се да јесте – и не само то, то је заиста једноставно за урадити и заправо пружа много значајније поруке о грешци.
Пример посла испод чита локалну КСМЛ датотеку и покушава да је користи са класом АкдЦустомер (која је класа документа коју користи услуга ЦустЦустомер) за креирање клијента. Можете направити сличне послове за све друге класе докумената, на пример АкдСалесОрдер, ако вам је потребно.
{
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');
}
Објекат АифЕнтитиКеи који је вратио метод цустомер.цреате() (који одговара операцији услуге "креирај" у АИФ-у) садржи информације о томе који клијент је креиран, између осталог РецИд креираног записа ЦустТабле.
Ако је оно што покушавате да тестирате излазни порт или ако вам је потребан само пример како би КСМЛ требало да изгледа на улазном порту, можете користити и класу документа да извезете клијента у датотеку уместо тога позивањем методе реад() (која одговара операцији услуге „читај“), на следећи начин:
{
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' бројем рачуна клијента којег желите да прочитате.