Miklix

Pozivanje AIF dokumenata direktno iz Ks ++ u Dinamics AKS 2012

Objavio: 19. mart 2025. 21:35:26 UTC

U ovom članku objašnjavam kako pozvati usluge dokumenata Application Integration Framevork u Dinamics AKS 2012 direktno iz Ks ++ koda, oponašajuć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 jezika kako bi bila dostupna što većem broju ljudi. Nažalost, mašinsko prevođenje još uvek nije usavršena tehnologija, tako da može doći do grešaka. Ako želite, možete pogledati originalnu englesku verziju ovde:

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

Informacije u ovom postu zasnovane su na Dynamics AX 2012 R3. Moguće je da nisu važeće za druge verzije.

Skoro sam pomogao kupcu da implementira Application Integration Framework (AIF) inbound port za kreiranje kupaca na osnovu podataka koje su primali iz drugog sistema. Pošto Dynamics AX već pruža CustCustomer dokument servis, koji implementira logiku za ovo, odlučili smo da to pojednostavimo i koristimo standardno rešenje.

Međutim, ubrzo se ispostavilo da je bilo mnogo problema u pokušaju da se eksterni sistem natera da generiše XML koji će Dynamics AX prihvatiti. XML šema koju generiše Dynamics AX je prilično složena i takođe se čini da postoje neki bagovi u Dynamics AX koji ponekad uzrokuju da odbije XML koji je šematski validan prema drugim alatima, tako da je sve u svemu, to bilo manje jednostavno nego što sam mislio.

Tokom ovog procesa, često sam se borio da shvatim šta tačno predstavlja problem sa određenim XML fajlovima, jer su poruke o greškama koje pruža AIF manje nego informativne. Takođe je bilo zamorno, jer sam morao da čekam da eksterni sistem pošalje novu poruku preko MSMQ i zatim ponovo da čekam da AIF preuzme poruku i obradi je pre nego što sam mogao da vidim grešku.

Zbog toga sam istraživao da li je moguće pozvati servisni kod direktno sa lokalnim XML fajlom za nešto brže testiranje i ispostavilo se da jeste - i ne samo to, zapravo je veoma jednostavno to uraditi i pruža mnogo značajnije poruke o greškama.

Primer zadatka ispod čita lokalni XML fajl i pokušava da ga koristi sa AxdCustomer klasom (koja je dokument klasa koju koristi CustCustomer servis) za kreiranje kupca. Možete napraviti slične zadatke za sve druge dokument klase, na primer AxdSalesOrder, ako vam zatreba.

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 objekat koji vraća customer.create() metoda (koja odgovara "create" servisnoj operaciji u AIF) sadrži informacije o tome koji kupac je kreiran, između ostalog i RecId kreiranog CustTable zapisa.

Ako ono što pokušavate da testirate jeste Outbound port umesto toga ili ako vam je samo potreban primer kako XML treba da izgleda na Inbound portu, možete takođe koristiti dokument klasu da izvezete kupca u fajl umesto toga pozivajući read() metodu (koja odgovara "read" servisnoj operaciji), kao što je prikazano:

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, trebalo bi da zamenite '123456' sa brojem računa kupca kojeg želite da pročitate.

Podeli na BlueskiPodeli na FejsbukuPodeli na LinkedInPodeli na TumblrPodeli na XPodeli na LinkedInPin na Pinterest

Mikkel Christensen

O autoru

Mikkel Christensen
Mikel je tvorac i vlasnik miklix.com. Ima preko 20 godina iskustva kao profesionalni kompjuterski programer / programer i trenutno je zaposlen sa punim radnim vremenom za veliku evropsku IT korporaciju. Kada ne bloguje, on provodi svoje slobodno vreme na širokom spektru interesovanja, hobija i aktivnosti, što se u određenoj meri može odraziti na različite teme koje se obrađuju na ovoj veb stranici.