AIF dokumentu pakalpojumu zvanīšana tieši no X++ programmā Dynamics AX 2012
Publicēts: 2025. gada 16. februāris 11:23:05 UTC
Pēdējo reizi atjaunināts: 2026. gada 12. janvāris 08:55:18 UTC
Šajā rakstā es paskaidroju, kā izsaukt Application Integration Framework dokumentu pakalpojumus Dynamics AX 2012 tieši no X++ koda, emulējot gan ienākošos, gan izejošos izsaukumus, kas var ievērojami atvieglot kļūdu atrašanu un atkļūdošanu AIF kodā.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Šajā ierakstā sniegtā informācija ir balstīta uz Dynamics AX 2012 R3. Tā var būt vai nebūt derīga citām versijām.
Nesen palīdzēju klientam ieviest lietojumprogrammu integrācijas ietvara (AIF) ienākošo portu klientu izveidei, pamatojoties uz datiem, ko viņi saņem no citas sistēmas. Tā kā Dynamics AX jau nodrošina CustCustomer dokumentu pakalpojumu, kas īsteno šo loģiku, mēs nolēmām to saglabāt vienkāršu un izmantot standarta risinājumu.
Tomēr drīz vien izrādījās, ka pastāv daudz problēmu, lai ārēja sistēma ģenerētu XML, ko Dynamics AX pieņemtu. Dynamics AX ģenerētā XML shēma ir diezgan sarežģīta, un šķiet, ka Dynamics AX ir arī dažas kļūdas, kuru dēļ tā dažreiz noraida XML, kas saskaņā ar citiem rīkiem ir shēmai derīgs, tāpēc kopumā tas izrādījās mazāk vienkārši, nekā biju domājis.
Pērkot šo darbu, man bieži bija grūti saprast, kāda tieši ir problēma ar noteiktiem XML failiem, jo AIF sniegtie kļūdu ziņojumi nav īpaši informatīvi. Tas bija arī nogurdinoši, jo man bija jāgaida, kamēr ārējā sistēma nosūtīs jaunu ziņojumu, izmantojot MSMQ, un pēc tam vēlreiz, kamēr AIF saņems ziņojumu un apstrādās to, pirms es varēju redzēt kļūdu.
Tāpēc es izpētīju, vai ir iespējams izsaukt pakalpojuma kodu tieši ar lokālu XML failu, lai paātrinātu testēšanu, un izrādās, ka tas ir iespējams — un ne tikai tas, to ir ļoti vienkārši izdarīt, un tas faktiski sniedz daudz jēgpilnākus kļūdu ziņojumus.
Tālāk sniegtajā piemērā sniegtais uzdevums nolasa lokālu XML failu un mēģina to izmantot kopā ar AxdCustomer klasi (kas ir dokumentu klase, ko izmanto CustCustomer pakalpojums), lai izveidotu klientu. Ja nepieciešams, varat izveidot līdzīgus uzdevumus visām pārējām dokumentu klasēm, piemēram, 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 objekts, ko atgriež metode customer.create() (kas atbilst pakalpojuma operācijai "create" AIF), satur informāciju par to, kurš klients tika izveidots, cita starpā izveidotā CustTable ieraksta RecId.
Ja mēģināt pārbaudīt izejošo portu vai arī jums vienkārši nepieciešams piemērs tam, kā XML jāizskatās ienākošajā portā, varat arī izmantot dokumenta klasi, lai eksportētu klientu uz failu, izsaucot metodi read() (kas atbilst pakalpojuma operācijai "read") šādi:
{
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');
}
Protams, "123456" jāaizstāj ar klienta konta numuru, kuru vēlaties nolasīt.
Papildu lasāmviela
Ja jums patika šī ziņa, jums varētu patikt arī šie ieteikumi:
- SysExtension Framework izmantošana, lai uzzinātu, kuru apakšklasi iemiesot programmā Dynamics AX 2012
- Kā atkārtot Enum elementus no X++ koda programmā Dynamics AX 2012
- Dokumentu klases un vaicājuma identificēšana AIF pakalpojumam programmā Dynamics AX 2012
