Повикување на 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, ако ви треба.
{
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() (што одговара на операцијата на услугата „читај“), наместо тоа:
{
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“ со бројот на сметката на клиентот што сакате да го прочитате.