Miklix

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

Paskelbta: 2025 m. vasario 16 d. 11:23:04 UTC

Šiame straipsnyje paaiškinu, kaip iškviesti „Dynamics AX 2012“ programų integravimo pagrindų dokumentų tarnybas tiesiai iš X++ kodo, emuliuojant tiek gaunamus, tiek išeinančius skambučius, o tai gali žymiai palengvinti AIF kodo klaidų paiešką ir derinimą.


Š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. Jis gali galioti arba negalioja kitoms versijoms.

Neseniai padėjau klientui įdiegti taikomųjų programų integravimo sistemos (AIF) įeinantį prievadą, kad sukurtų klientus pagal duomenis, kuriuos jie gauna iš kitos sistemos. Kadangi „Dynamics AX“ jau teikia „CustCustomer“ dokumentų paslaugą, kuri įgyvendina to logiką, nusprendėme, kad tai būtų paprasta ir naudosime standartinį sprendimą.

Tačiau netrukus paaiškėjo, kad iškilo daug problemų norint, kad išorinė sistema generuotų XML, kurį priimtų Dynamics AX. „Dynamics AX“ sukurta XML schema yra gana sudėtinga, be to, atrodo, kad „Dynamics AX“ yra keletas klaidų, dėl kurių ji kartais atmeta XML, kuris galioja pagal kitus įrankius, todėl apskritai ji pasirodė ne tokia paprasta, nei aš maniau.

Vykdydamas pastangas, man dažnai buvo sunku išsiaiškinti, kokia tiksliai yra tam tikrų XML failų problema, nes AIF pateikiami klaidų pranešimai yra ne tokie informatyvūs. Tai taip pat buvo nuobodu, nes turėjau palaukti, kol išorinė sistema išsiųs naują pranešimą per MSMQ, o tada dar kartą, kol AIF pasiims pranešimą ir jį apdoros, kol galėjau pamatyti klaidą.

Todėl ištyriau, ar galima iškviesti paslaugos kodą tiesiogiai naudojant vietinį XML failą, kad būtų galima greičiau išbandyti, ir paaiškėjo, kad taip yra – ir negana to, tai tikrai paprasta padaryti ir iš tikrųjų pateikia daug prasmingesnių klaidų pranešimų.

Toliau pateiktame pavyzdiniame užduotyje nuskaitomas vietinis XML failas ir bandoma jį naudoti su AxdCustomer klase (kuri yra „CustCustomer“ tarnybos naudojama dokumentų klasė), kad sukurtų klientą. Jei reikia, galite atlikti 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');
}

Objekte AifEntityKey, kurį grąžino metodas customer.create() (kuris atitinka AIF paslaugos „kurti“ operaciją), yra informacijos apie tai, kuris klientas buvo sukurtas, be kita ko, sukurto CustTable įrašo RecId.

Jei bandote patikrinti išeinantį prievadą arba jums tiesiog reikia pavyzdžio, kaip XML turėtų atrodyti įeinančiame prievade, taip pat galite naudoti dokumento klasę, kad eksportuotumėte klientą į failą, vietoj to iškviesdami read() metodą (atitinkantį „skaitymo“ paslaugos operaciją), pavyzdžiui:

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, turėtumėte pakeisti „123456“ kliento, kurį norite perskaityti, sąskaitos numeriu.

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

Mikkel Bang Christensen

Apie autorių

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