Miklix

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

Objavljeno: 16. februar 2025 ob 11:23:14 dop. UTC

V tem članku razlagam, kako poklicati storitve dokumentov Application Integration Framework v Dynamics AX 2012 neposredno iz kode X++, pri čemer posnemam vhodne in odhodne klice, 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 Dynamics AX 2012 R3. Lahko velja ali ne velja za druge različice.

Pred kratkim sem stranki pomagal implementirati vhodna vrata Application Integration Framework (AIF) za ustvarjanje strank na podlagi podatkov, ki so jih prejemali iz drugega sistema. Ker Dynamics AX že ponuja dokumentno storitev CustCustomer, ki implementira logiko za to, smo se odločili, da ostane preprosta in uporabimo standardno rešitev.

Vendar se je kmalu izkazalo, da je veliko težav, da bi zunanji sistem ustvaril XML, ki bi ga Dynamics AX sprejel. Shema XML, ki jo ustvari Dynamics AX, je precej zapletena in zdi se tudi, da je v Dynamics AX malo napak, zaradi katerih včasih zavrne XML, ki je shema veljaven glede na druga orodja, tako da se je vse skupaj izkazalo za manj preprosto, kot sem mislil.

Med prizadevanjem sem se pogosto trudil ugotoviti, v čem je natančna težava z določenimi datotekami XML, ker sporočila o napakah, ki jih ponuja AIF, niso dovolj informativna. Bilo je tudi dolgočasno, ker sem moral počakati, da je zunanji sistem poslal novo sporočilo prek MSMQ, nato pa znova, da je AIF prevzel sporočilo in ga obdelal, preden sem videl napako.

Zato sem raziskal, ali je mogoče storitveno kodo priklicati neposredno z lokalno datoteko XML za nekoliko hitrejše testiranje in izkazalo se je, da je – in ne samo to, to je zelo preprosto narediti 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 dokumenta, ki ga uporablja storitev CustCustomer) za ustvarjanje stranke. Podobna opravila lahko naredite za vse druge razrede dokumentov, na primer AxdSalesOrder, če jih potrebujete.

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 RecId ustvarjenega zapisa CustTable.

Če namesto tega poskušate preizkusiti izhodna vrata ali če samo potrebujete primer, kako bi moral izgledati XML na vhodnih vratih, lahko uporabite tudi razred dokumenta za izvoz stranke v datoteko, tako da namesto tega pokličete metodo read() (ki ustreza operaciji storitve »branje«), 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 brati.

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

Mikkel Bang Christensen

O avtorju

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