Miklix

AIF-i dokumenditeenustele helistamine otse rakendusest X++ rakenduses Dynamics AX 2012

Avaldatud: 16. veebruar 2025, kell 11:22:56 UTC

Selles artiklis selgitan, kuidas kutsuda Dynamics AX-i 2012 rakenduse integratsiooniraamistiku dokumenditeenuseid otse X++ koodist, emuleerides nii sissetulevaid kui ka väljaminevaid kõnesid, mis võib oluliselt hõlbustada AIF-i koodis vigade leidmist ja silumist.


See lehekülg on inglise keelest masintõlgitud, et muuta see võimalikult paljudele inimestele kättesaadavaks. Kahjuks ei ole masintõlge veel täiuslik tehnoloogia, mistõttu võivad esineda vead. Kui soovite, võite vaadata ingliskeelset originaalversiooni siin:

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

Selles postituses olev teave põhineb Dynamics AX-i 2012 R3-l. See võib teiste versioonide jaoks kehtida, kuid ei pruugi kehtida.

Aitasin hiljuti ühel kliendil rakendada rakenduste integreerimise raamistiku (AIF) sissetulevat porti, et luua kliente teisest süsteemist saadud andmete põhjal. Kuna Dynamics AX pakub juba dokumentide teenust CustCustomer, mis rakendab selle loogika, otsustasime jätta selle lihtsaks ja kasutada standardlahendust.

Peagi aga selgus, et välissüsteemi Dynamics AX-iga aktsepteeritava XML-i genereerimiseks oli palju probleeme. Dynamics AX-i loodud XML-skeem on üsna keeruline ja tundub, et Dynamics AX-is on vähe vigu, mis mõnikord põhjustavad selle XML-i tagasilükkamise, mis on muude tööriistade järgi skeemiga kehtiv, nii et kokkuvõttes osutus see vähem lihtsaks, kui ma arvasin.

Ettevõtmise ajal oli mul sageli raskusi, et aru saada, mis probleem teatud XML-failidega täpselt oli, sest AIF-i veateated on vähem informatiivsed. See oli ka tüütu, sest pidin ootama, kuni väline süsteem saadab MSMQ kaudu uue sõnumi ja siis uuesti, et AIF sõnumi üles korjaks ja seda töötleks, enne kui ma tõrget näen.

Seetõttu uurisin, kas on võimalik kutsuda teeninduskoodi otse kohaliku XML-failiga, et testida mõnevõrra kiiremini, ja selgus, et see on nii – ja mitte ainult, seda on tõesti lihtne teha ja see annab tegelikult palju sisukamaid veateateid.

Allolev näidistöö loeb kohalikku XML-faili ja proovib seda kliendi loomiseks kasutada koos klassiga AxdCustomer (see on klienditeeninduses kasutatav dokumendiklass). Vajadusel saate teha sarnaseid töid kõigi teiste dokumendiklasside jaoks, näiteks 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');
}

Meetodi customer.create() poolt tagastatud objekt AifEntityKey (mis vastab AIF-is teenuse "loo" toimingule) sisaldab teavet selle kohta, milline klient loodi, muu hulgas loodud CustTable-kirje RecID-d.

Kui proovite testida hoopis väljaminevat porti või kui vajate lihtsalt näidet selle kohta, kuidas XML peaks sissetulevas pordis välja nägema, saate selle asemel kasutada kliendi faili eksportimiseks dokumendiklassi, kutsudes selle asemel välja meetodi read() (mis vastab teenuse "loe" toimingule), näiteks järgmiselt:

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

Loomulikult peaksite asendama '123456' selle kliendi kontonumbriga, keda soovite lugeda.

Jagage Bluesky'sJaga FacebookisJagage LinkedInisJaga TumblrisJaga X-isJagage LinkedInisKinnitage Pinterestis

Mikkel Bang Christensen

Autorist

Mikkel Bang Christensen
Mikkel on miklix.com looja ja omanik. Tal on üle 20 aasta kogemust professionaalse programmeerija/tarkvaraarendajana ning praegu töötab ta täiskohaga suures Euroopa IT-ettevõttes. Kui ta ei kirjuta blogi, veedab ta oma vaba aega mitmesuguste huvide, hobide ja tegevustega, mis võib mingil määral kajastuda sellel veebisaidil käsitletavate teemade mitmekesisuses.