Pozivanje AIF dokumenata direktno iz Ks ++ u Dinamics AKS 2012
Objavio: 19. mart 2025. 21:35:26 UTC
U ovom članku objašnjavam kako pozvati usluge dokumenata Application Integration Framevork u Dinamics AKS 2012 direktno iz Ks ++ koda, oponašajući i dolazne i odlazne pozive, što može znatno olakšati pronalaženje i otklanjanje grešaka u AIF kodu.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Informacije u ovom postu zasnovane su na Dynamics AX 2012 R3. Moguće je da nisu važeće za druge verzije.
Skoro sam pomogao kupcu da implementira Application Integration Framework (AIF) inbound port za kreiranje kupaca na osnovu podataka koje su primali iz drugog sistema. Pošto Dynamics AX već pruža CustCustomer dokument servis, koji implementira logiku za ovo, odlučili smo da to pojednostavimo i koristimo standardno rešenje.
Međutim, ubrzo se ispostavilo da je bilo mnogo problema u pokušaju da se eksterni sistem natera da generiše XML koji će Dynamics AX prihvatiti. XML šema koju generiše Dynamics AX je prilično složena i takođe se čini da postoje neki bagovi u Dynamics AX koji ponekad uzrokuju da odbije XML koji je šematski validan prema drugim alatima, tako da je sve u svemu, to bilo manje jednostavno nego što sam mislio.
Tokom ovog procesa, često sam se borio da shvatim šta tačno predstavlja problem sa određenim XML fajlovima, jer su poruke o greškama koje pruža AIF manje nego informativne. Takođe je bilo zamorno, jer sam morao da čekam da eksterni sistem pošalje novu poruku preko MSMQ i zatim ponovo da čekam da AIF preuzme poruku i obradi je pre nego što sam mogao da vidim grešku.
Zbog toga sam istraživao da li je moguće pozvati servisni kod direktno sa lokalnim XML fajlom za nešto brže testiranje i ispostavilo se da jeste - i ne samo to, zapravo je veoma jednostavno to uraditi i pruža mnogo značajnije poruke o greškama.
Primer zadatka ispod čita lokalni XML fajl i pokušava da ga koristi sa AxdCustomer klasom (koja je dokument klasa koju koristi CustCustomer servis) za kreiranje kupca. Možete napraviti slične zadatke za sve druge dokument klase, na primer AxdSalesOrder, ako vam zatreba.
{
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 objekat koji vraća customer.create() metoda (koja odgovara "create" servisnoj operaciji u AIF) sadrži informacije o tome koji kupac je kreiran, između ostalog i RecId kreiranog CustTable zapisa.
Ako ono što pokušavate da testirate jeste Outbound port umesto toga ili ako vam je samo potreban primer kako XML treba da izgleda na Inbound portu, možete takođe koristiti dokument klasu da izvezete kupca u fajl umesto toga pozivajući read() metodu (koja odgovara "read" servisnoj operaciji), kao što je prikazano:
{
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');
}
Naravno, trebalo bi da zamenite '123456' sa brojem računa kupca kojeg želite da pročitate.