Miklix

Skambinimas AIF dokumentų tarnyboms tiesiai iš X++ naudojant Dynamics AX 2012

Paskelbta: 2025 m. vasario 16 d. 11:23:04 UTC
Paskutinį kartą atnaujinta: 2026 m. sausio 12 d. 08:55:17 UTC

Šiame straipsnyje paaiškinu, kaip iškviesti „Application Integration Framework“ dokumentų paslaugas „Dynamics AX 2012“ sistemoje tiesiai iš X++ kodo, emuliuojant tiek įeinančius, tiek išeinančius iškvietimus, o tai gali gerokai palengvinti klaidų paiešką ir derinimą AIF kode.


Šis puslapis buvo mašininiu būdu išverstas iš anglų kalbos, kad juo galėtų naudotis kuo daugiau žmonių. Deja, mašininis vertimas dar nėra tobula technologija, todėl gali pasitaikyti klaidų. Jei pageidaujate, originalią versiją anglų kalba galite peržiūrėti čia:

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

Šiame įraše pateikta informacija pagrįsta „Dynamics AX 2012 R3“. Ji gali tikti arba netikti kitoms versijoms.

Neseniai padėjau klientui įdiegti programų integravimo sistemos (AIF) įeinantį prievadą, skirtą klientams kurti remiantis duomenimis, kuriuos jie gauna iš kitos sistemos. Kadangi „Dynamics AX“ jau teikia „CustCustomer“ dokumentų paslaugą, kuri įgyvendina šios sistemos logiką, nusprendėme išlaikyti paprastumą ir naudoti standartinį sprendimą.

Tačiau netrukus paaiškėjo, kad kyla daug problemų bandant priversti išorinę sistemą sugeneruoti XML, kurį priimtų „Dynamics AX“. „Dynamics AX“ generuojama XML schema yra gana sudėtinga, be to, atrodo, kad joje yra keletas klaidų, dėl kurių ji kartais atmeta XML, kuris pagal kitus įrankius yra tinkamas schemai, taigi, apibendrinant, tai pasirodė esą ne taip paprasta, kaip maniau.

Šio darbo metu dažnai sunkiai sekėsi išsiaiškinti, kokia tiksliai yra tam tikrų XML failų problema, nes AIF pateikiami klaidų pranešimai nėra labai informatyvūs. Tai taip pat buvo varginantis procesas, nes turėjau laukti, kol išorinė sistema atsiųs naują pranešimą per MSMQ, o tada dar kartą, kol AIF jį priims ir apdoros, kol pamatysiu klaidą.

Todėl ištyriau, ar įmanoma tiesiogiai iškviesti paslaugos kodą naudojant vietinį XML failą, kad testavimas būtų šiek tiek greitesnis, ir paaiškėjo, kad taip – ir ne tik tai, tai padaryti labai paprasta ir iš tikrųjų pateikia daug prasmingesnius klaidų pranešimus.

Žemiau pateiktas pavyzdinis darbas nuskaito vietinį XML failą ir bando jį naudoti su „AxdCustomer“ klase (kuri yra „CustCustomer“ paslaugos naudojama dokumentų klasė), kad sukurtų klientą. Jei reikia, galite sukurti panašias užduotis visoms kitoms dokumentų klasėms, pavyzdžiui, „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');
}

„AifEntityKey“ objektas, kurį grąžina metodas customer.create() (kuris atitinka paslaugos kūrimo operaciją AIF), yra informacija apie tai, kuris klientas buvo sukurtas, be kita ko, sukurto „CustTable“ įrašo „RecId“.

Jei bandote patikrinti siunčiamąjį prievadą arba tiesiog norite pamatyti, kaip XML turėtų atrodyti gaunamajame prievade, galite naudoti dokumento klasę, kad eksportuotumėte klientą į failą, iškviesdami read() metodą (atitinkantį „skaityti“ paslaugos operaciją), taip:

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

Žinoma, „123456“ turėtumėte pakeisti kliento, kurio duomenis norite perskaityti, sąskaitos numeriu.

Papildoma literatūra

Jei jums patiko šis įrašas, jums taip pat gali patikti šie pasiūlymai:


Pasidalinkite „Bluesky“.Dalintis FacebookBendrinkite „LinkedIn“.Bendrinkite „Tumblr“.Dalintis XBendrinkite „LinkedIn“.Prisegti prie Pinterest

Mikkel Christensen

Apie autorių

Mikkel Christensen
Mikkelis yra miklix.com kūrėjas ir savininkas. Jis turi daugiau nei 20 metų profesionalaus kompiuterių programuotojo ir programinės įrangos kūrėjo patirtį ir šiuo metu visą darbo dieną dirba didelėje Europos IT korporacijoje. Kai jis nerašo tinklaraščio, laisvalaikį skiria įvairiems interesams, pomėgiams ir užsiėmimams, kurie tam tikra prasme gali atsispindėti šioje svetainėje nagrinėjamų temų įvairovėje.