Miklix

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

Objavljeno: 16. veljače 2025. u 11:24:35 UTC

U ovom članku objašnjavam kako pozvati usluge dokumenata Application Integration Framework u Dynamics AX 2012 izravno iz X++ koda, emulirajući i dolazne i odlazne pozive, što može značajno 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. Može, ali i ne mora vrijediti za druge verzije.

Nedavno sam pomagao kupcu implementirati ulazni port Application Integration Framework (AIF) za kreiranje korisnika na temelju podataka koje su primali iz drugog sustava. Kako Dynamics AX već nudi uslugu dokumenata CustCustomer, koja implementira logiku za to, odlučili smo je zadržati jednostavnošću i koristiti standardno rješenje.

Međutim, ubrzo se pokazalo 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 također se čini da u Dynamics AX-u postoji nekoliko grešaka koje ponekad uzrokuju odbacivanje XML-a koji je shema valjan prema drugim alatima, pa se sve u svemu pokazalo manje jednostavnim nego što sam mislio.

Tijekom nastojanja često sam se mučio dokučiti u čemu je točno problem s određenim XML datotekama jer poruke o pogrešci koje daje AIF nisu dovoljno informativne. Bilo je i zamorno, jer sam morao čekati da vanjski sustav pošalje novu poruku preko MSMQ-a, a zatim ponovo da AIF preuzme poruku i obradi je prije nego što sam mogao vidjeti pogrešku.

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

Primjer posla u nastavku čita lokalnu XML datoteku i pokušava je upotrijebiti s klasom AxdCustomer (koja je klasa dokumenta koju koristi usluga CustCustomer) za stvaranje kupca. 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');
}

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

Ako je ono što pokušavate testirati umjesto toga izlazni port ili ako vam samo treba primjer kako bi XML trebao izgledati na ulaznom portu, također možete upotrijebiti klasu dokumenta za izvoz korisnika u datoteku umjesto pozivanjem metode read() (koja odgovara operaciji usluge "čitanje"), 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' brojem računa kupca kojeg želite očitati.

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

Mikkel Bang Christensen

O autoru

Mikkel Bang 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.