Miklix

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

Objavljeno: 16. februar 2025. u 11:24:32 UTC
Posljednje ažurirano: 12. januar 2026. u 08:55:37 UTC

U ovom članku objašnjavam kako direktno iz X++ koda pozvati servise dokumenata Application Integration Framework-a u Dynamics AX 2012, emulirajući i dolazne i odlazne pozive, što može značajno 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 zasnovane su na Dynamics AX 2012 R3. Mogu, ali i ne moraju biti važeće za druge verzije.

Nedavno sam pomagao klijentu da implementira dolazni port za Application Integration Framework (AIF) za kreiranje kupaca na osnovu podataka koje su primali iz drugog sistema. Budući da Dynamics AX već pruža uslugu dokumenata CustCustomer, koja implementira logiku za ovo, odlučili smo da to bude jednostavno i da koristimo standardno rješenje.

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

Tokom tog poduhvata, često sam se mučio da shvatim u čemu je tačno problem sa određenim XML datotekama jer poruke o grešci koje pruža AIF nisu bile dovoljno informativne. Također je bilo zamorno, jer sam morao čekati da eksterni sistem pošalje novu poruku preko MSMQ-a, a zatim ponovo da AIF preuzme poruku i obradi je prije nego što bih mogao vidjeti grešku.

Stoga sam istražio da li je moguće pozvati servisni kod direktno iz lokalne XML datoteke radi nešto bržeg testiranja i ispostavilo se da jeste - i ne samo to, to je zaista jednostavno za uraditi i zapravo pruža mnogo više smislenih poruka o greš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 kreiranje 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 klijenta kojem želite pročitati podatke.

Dodatno čitanje

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


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

Mikkel Christensen

O autoru

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