Miklix

Klicanje dokumentnih storitev AIF neposredno iz X++ v Dynamics AX 2012

Objavljeno: 16. februar 2025 ob 11:23:14 dop. UTC
Nazadnje posodobljeno: 12. januar 2026 ob 8:55:23 dop. UTC

V tem članku pojasnjujem, kako v programu Dynamics AX 2012 neposredno iz kode X++ poklicati storitve dokumentov ogrodja za integracijo aplikacij, pri čemer se posnemajo tako vhodni kot odhodni klici, kar lahko bistveno olajša iskanje in odpravljanje napak v kodi AIF.


Ta stran je bila strojno prevedena iz angleščine, da bi bila dostopna čim večjemu številu ljudi. Žal strojno prevajanje še ni popolna tehnologija, zato lahko pride do napak. Če želite, si lahko izvirno angleško različico ogledate tukaj:

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

Informacije v tej objavi temeljijo na programu Dynamics AX 2012 R3. Morda veljajo za druge različice, morda pa tudi ne.

Pred kratkim sem stranki pomagal pri implementaciji vhodnega porta ogrodja za integracijo aplikacij (AIF) za ustvarjanje strank na podlagi podatkov, ki so jih prejemale iz drugega sistema. Ker Dynamics AX že ponuja storitev dokumentov CustCustomer, ki implementira logiko za to, smo se odločili, da bomo poenostavili in uporabili standardno rešitev.

Vendar se je kmalu izkazalo, da je bilo veliko težav pri ustvarjanju XML-a, ki bi ga Dynamics AX sprejel, s strani zunanjega sistema. Shema XML, ki jo je ustvaril Dynamics AX, je precej zapletena in zdi se, da je v Dynamics AX nekaj napak, zaradi katerih včasih zavrne XML, ki je po mnenju drugih orodij veljaven glede na shemo, zato se je na splošno izkazalo, da je manj preprosto, kot sem mislil.

Med poskusom sem se pogosto trudil ugotoviti, kaj točno je težava z določenimi datotekami XML, ker so sporočila o napakah, ki jih je posredoval AIF, manj informativna. Bilo je tudi dolgočasno, saj sem moral čakati, da zunanji sistem pošlje novo sporočilo prek MSMQ-ja, nato pa še enkrat, da ga AIF prevzame in obdela, preden sem lahko opazil napako.

Zato sem raziskal, ali je mogoče poklicati servisno kodo neposredno z lokalno datoteko XML za nekoliko hitrejše testiranje, in izkazalo se je, da je - in ne samo to, to je res preprosto in dejansko zagotavlja veliko bolj smiselna sporočila o napakah.

Spodnji primer opravila prebere lokalno datoteko XML in jo poskuša uporabiti z razredom AxdCustomer (ki je razred dokumentov, ki ga uporablja storitev CustCustomer) za ustvarjanje stranke. Po potrebi lahko ustvarite podobna opravila za vse druge razrede dokumentov, na primer AxdSalesOrder.

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, ki ga vrne metoda customer.create() (ki ustreza operaciji storitve »create« v AIF), vsebuje informacije o tem, katera stranka je bila ustvarjena, med drugim tudi RecId ustvarjenega zapisa CustTable.

Če želite preizkusiti odhodna vrata ali če potrebujete le primer, kako naj bi XML izgledal na vhodnih vratih, lahko za izvoz stranke v datoteko uporabite tudi razred dokumentov, tako da pokličete metodo read() (ki ustreza operaciji storitve »read«), takole:

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');
}

Seveda morate '123456' zamenjati s številko računa stranke, ki jo želite prebrati.

Nadaljnje branje

Če vam je bila ta objava všeč, vam bodo morda všeč tudi ti predlogi:


Delite na BlueskyDelite na FacebookuDelite na LinkedInuDelite na TumblrDelite na XDelite na LinkedInuPripni na Pinterest

Mikkel Christensen

O avtorju

Mikkel Christensen
Mikkel je avtor in lastnik spletne strani miklix.com. Ima več kot 20 let izkušenj kot profesionalni računalniški programer/razvijalec programske opreme in je trenutno za polni delovni čas zaposlen v veliki evropski IT korporaciji. Kadar ne piše bloga, svoj prosti čas posveča številnim interesom, hobijem in dejavnostim, kar se do neke mere odraža v raznolikosti tem na tem spletnem mestu.