Позивање АИФ Доцумент Сервицес директно са Кс++ у Динамицс АКС 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, ако је потребно.
{
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“), овако:
{
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“ бројем рачуна клијента чији подаци желе да се очитају.
Даље читање
Ако сте уживали у овом посту, можда ће вам се свидети и ови предлози:
- Идентификовање класе документа и упита за АИФ услугу у Динамицс АКС 2012
- Како прећи преко елемената енума из Кс++ кода у Динамицс АКС 2012
- Избришите правно лице (налози предузећа) у Динамицс АКС 2012
