Pozivanje AIF Document Services direktno iz X++ u Dynamics AX 2012
Objavljeno: 16. februar 2025. u 11:24:32 UTC
U ovom članku, objašnjavam kako pozvati Application Integration Framework usluge dokumenata u Dynamics AX 2012 direktno iz X++ koda, emulirajuć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 su zasnovane na Dynamics AX 2012 R3. Može ili ne mora vrijediti za druge verzije.
Nedavno sam pomagao klijentu da implementira Application Integration Framework (AIF) ulazni port za kreiranje klijenata na osnovu podataka koje su primali iz drugog sistema. Kako Dynamics AX već pruža CustCustomer uslugu dokumenata, koja implementira logiku za ovo, odlučili smo da bude jednostavna i da koristimo standardno rješenje.
Međutim, ubrzo se ispostavilo da je bilo mnogo problema da se eksterni sistem generiše XML koji bi Dynamics AX prihvatio. XML shema koju je generirao Dynamics AX je prilično složena i također se čini da ima nekoliko grešaka u Dynamics AX-u koje ponekad uzrokuju da odbije XML koji je valjan za shemu prema drugim alatima, tako da se sve u svemu, pokazalo da je manje jednostavno nego što sam mislio.
Tokom poduhvata, često sam se borio da shvatim šta je tačno problem sa određenim XML datotekama jer su poruke o greškama koje pruža AIF manje informativne. To je također bilo zamorno, jer sam morao čekati da vanjski sustav pošalje novu poruku preko MSMQ-a, a zatim opet za AIF da pokupi poruku i obradi je prije nego što sam mogao vidjeti grešku.
Stoga sam istražio da li je moguće pozvati servisni kod direktno sa lokalnom XML datotekom za nešto brže testiranje i ispostavilo se da je to - i ne samo to, to je stvarno jednostavno za napraviti i zapravo pruža mnogo više smislenih poruka o greškama.
Primjer posla ispod čita lokalnu XML datoteku i pokušava je koristiti sa klasom AxdCustomer (koja je klasa dokumenta koju koristi CustCustomer servis) za kreiranje klijenta. Možete napraviti slične poslove za sve ostale klase dokumenata, na primjer AxdSalesOrder, ako vam je potrebno.
{
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 objekt vraćen metodom customer.create() (koja odgovara operaciji "create" usluge u AIF-u) sadrži informacije o tome koji je klijent kreiran, između ostalog RecId kreiranog CustTable zapisa.
Ako je ono što pokušavate testirati Outbound port umjesto toga ili ako vam je potreban primjer kako bi XML trebao izgledati na Inbound portu, možete također koristiti klasu document za izvoz kupca u datoteku umjesto pozivanjem read() metode (koja odgovara operaciji "read" servisa) umjesto toga, ovako:
{
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, trebali biste zamijeniti '123456' s brojem računa kupca kojeg želite pročitati.