AIF dokumentu pakalpojumu zvanīšana tieši no X++ programmā Dynamics AX 2012
Publicēts: 2025. gada 16. februāris 11:23:05 UTC
Šajā rakstā es paskaidrošu, kā Dynamics AX 2012 izsaukt lietojumprogrammu integrācijas ietvara dokumentu pakalpojumus tieši no X++ koda, emulējot gan ienākošos, gan izejošos zvanus, 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ā ziņā sniegtā informācija ir balstīta uz Dynamics AX 2012 R3. Tas var būt un var nebūt derīgs citām versijām.
Es nesen palīdzēju klientam ieviest lietojumprogrammu integrācijas sistēmas (AIF) ienākošo portu, lai izveidotu klientus, pamatojoties uz datiem, ko viņi saņēma no citas sistēmas. Tā kā Dynamics AX jau nodrošina dokumentu pakalpojumu CustCustomer, kas ievieš šī 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 radās daudz problēmu, liekot ārējai sistēmai ģenerēt XML, ko Dynamics AX pieņemtu. Dynamics AX ģenerētā XML shēma ir diezgan sarežģīta, un šķiet, ka programmā Dynamics AX ir dažas kļūdas, kuru dēļ tas dažreiz noraida XML, kas ir derīgs saskaņā ar citiem rīkiem, tāpēc kopumā tā izrādījās mazāk vienkārša, nekā es domāju.
Pasākuma laikā es bieži centos noskaidrot, kāda tieši ir problēma ar noteiktiem XML failiem, jo AIF sniegtie kļūdu ziņojumi nav tik informatīvi. Tas bija arī nogurdinoši, jo man bija jāgaida, līdz ārējā sistēma nosūtīs jaunu ziņojumu, izmantojot MSMQ, un pēc tam vēlreiz, kamēr AIF paņems ziņojumu un apstrādās to, pirms es redzēju kļūdu.
Tāpēc es izpētīju, vai ir iespējams izsaukt pakalpojuma kodu tieši ar vietējo XML failu, lai veiktu ātrāku testēšanu, un izrādījās, ka tas tā ir – un ne tikai, tas ir patiešām vienkārši izdarāms un faktiski sniedz daudz jēgpilnākus kļūdu ziņojumus.
Tālāk sniegtajā darba piemērā tiek nolasīts lokālais XML fails un mēģināts to izmantot kopā ar AxdCustomer klasi (kas ir pakalpojuma CustCustomer izmantotā dokumentu klase), lai izveidotu klientu. Ja nepieciešams, varat veikt līdzīgus darbus 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 "izveidot" darbībai AIF), satur informāciju par to, kurš klients tika izveidots, cita starpā izveidotā CustTable ieraksta RecId.
Ja tā vietā mēģināt pārbaudīt izejošo portu vai vienkārši nepieciešams piemērs tam, kā XML vajadzētu izskatīties ienākošajā portā, varat arī izmantot dokumenta klasi, lai eksportētu klientu uz failu, tā vietā izsaucot metodi read() (kas atbilst pakalpojuma "lasīšanas" darbībai), piemēram:
{
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, jums jāaizstāj "123456" ar tā klienta konta numuru, kuru vēlaties lasīt.