Miklix

Pozivanje AIF Document Services izravno iz X++ u Dynamics AX 2012

Objavljeno: 16. veljače 2025. u 11:24:35 UTC
Zadnje ažuriranje: 12. siječnja 2026. u 08:55:38 UTC

U ovom članku objašnjavam kako izravno iz X++ koda pozvati servise dokumenata Application Integration Frameworka u Dynamics AX 2012, emulirajući i dolazne i odlazne pozive, što može znatno olakšati pronalaženje i otklanjanje pogrešaka u AIF kodu.


Ova je stranica strojno prevedena s engleskog kako bi bila dostupna što većem broju ljudi. Nažalost, strojno prevođenje još nije usavršena tehnologija pa se mogu pojaviti pogreške. Ako želite, izvornu englesku verziju možete pogledati ovdje:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Informacije u ovom postu temelje se na Dynamics AX 2012 R3. Mogu, ali i ne moraju biti važeće za druge verzije.

Nedavno sam pomagao klijentu implementirati dolazni port Application Integration Frameworka (AIF) za stvaranje klijenata na temelju podataka koje su primali iz drugog sustava. Budući da Dynamics AX već pruža uslugu dokumenata CustCustomer, koja implementira logiku za to, odlučili smo se za jednostavnost i koristiti standardno rješenje.

Međutim, ubrzo se ispostavilo da postoji mnogo problema s navođenjem vanjskog sustava da generira XML koji bi Dynamics AX prihvatio. XML shema koju generira Dynamics AX prilično je složena i čini se da postoji nekoliko grešaka u Dynamics AX-u koje ponekad uzrokuju da odbije XML koji je shema valjana prema drugim alatima, pa se sve u svemu pokazalo manje jednostavnim nego što sam mislio.

Tijekom tog nastojanja često sam se mučio shvatiti u čemu je točno problem s određenim XML datotekama jer poruke o pogreškama koje pruža AIF nisu bile dovoljno informativne. Također je bilo zamorno jer sam morao čekati da vanjski sustav pošalje novu poruku putem MSMQ-a, a zatim ponovno da AIF preuzme poruku i obradi je prije nego što sam mogao vidjeti grešku.

Stoga sam istražio je li moguće izravno pozvati servisni kod s lokalnom XML datotekom za nešto brže testiranje i ispostavilo se da jest - i ne samo to, to je stvarno jednostavno za napraviti i zapravo pruža puno smislenije poruke o pogrešci.

Primjer zadatka u nastavku čita lokalnu XML datoteku i pokušava je koristiti s klasom AxdCustomer (što je klasa dokumenata koju koristi usluga CustCustomer) za stvaranje kupca. Slične zadatke možete napraviti i za sve ostale klase dokumenata, na primjer AxdSalesOrder, ako 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');
}

Objekt AifEntityKey koji vraća metoda customer.create() (što odgovara operaciji usluge "create" u AIF-u) sadrži informacije o tome koji je kupac kreiran, između ostalog i RecId kreiranog zapisa CustTable.

Ako pokušavate testirati izlazni port ili vam je samo potreban primjer kako bi XML trebao izgledati na ulaznom portu, možete koristiti i klasu dokumenta za izvoz korisnika u datoteku pozivanjem metode read() (što odgovara operaciji usluge "read"), 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, '123456' biste trebali zamijeniti brojem računa korisnika kojem želite pročitati podatke.

Dodatno čitanje

Ako vam se svidio ovaj post, možda će vam se svidjeti i ovi prijedlozi:


Podijeli na BlueskyPodijelite na FacebookuPodijelite na LinkedInuPodijelite na TumblrPodijeli na XPodijelite na LinkedInuPrikvači na Pinterest

Mikkel Christensen

O autoru

Mikkel Christensen
Mikkel je kreator i vlasnik miklix.com. Ima više od 20 godina iskustva kao profesionalni računalni programer/razvijač softvera i trenutno je zaposlen na puno radno vrijeme za veliku europsku IT korporaciju. Kada ne piše blog, svoje slobodno vrijeme provodi na široku lepezu interesa, hobija i aktivnosti, što se u određenoj mjeri može odraziti na različite teme obrađene na ovoj web stranici.