Miklix

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.


Ova stranica je mašinski prevedena sa engleskog kako bi bila dostupna što većem broju ljudi. Nažalost, mašinsko prevođenje još nije usavršena tehnologija, pa može doći do grešaka. Ako želite, možete pogledati originalnu englesku verziju ovdje:

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.

static void CustomerCreate(Args _args)
{
    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:

static void CustomerRead(Args _args)
{
    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.

Podijelite na BlueskyPodijelite na FacebookuPodijelite na LinkedIn-uPodijelite na Tumblr-uPodijeli na XPodijelite na LinkedIn-uPrikači na Pinterest

Mikkel Bang Christensen

O autoru

Mikkel Bang Christensen
Mikkel je kreator i vlasnik miklix.com. Ima preko 20 godina iskustva kao profesionalni kompjuterski programer/programer softvera i trenutno je zaposlen sa punim radnim vremenom u velikoj evropskoj IT korporaciji. Kada ne piše blog, svoje slobodno vrijeme provodi na širokom spektru interesovanja, hobija i aktivnosti, što se u određenoj mjeri može odraziti na različite teme koje se obrađuju na ovoj web stranici.