Miklix

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

Avaldatud: 16. veebruar 2025, kell 11:22:56 UTC
Viimati uuendatud: 12. jaanuar 2026, kell 08:55:13 UTC

Selles artiklis selgitan, kuidas kutsuda Dynamics AX 2012-s rakenduste integreerimise raamistiku dokumenditeenuseid otse X++ koodist, emuleerides nii sissetulevaid kui ka väljaminevaid kõnesid, mis võib oluliselt lihtsustada AIF-koodi 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

Selle postituse teave põhineb Dynamics AX 2012 R3-l. See ei pruugi kehtida teiste versioonide puhul.

Hiljuti aitasin ühel kliendil rakendada rakenduste integreerimise raamistiku (AIF) sissetulevat porti klientide loomiseks andmete põhjal, mida nad teisest süsteemist said. Kuna Dynamics AX pakub juba CustCustomeri dokumenditeenust, mis rakendab selle loogikat, otsustasime hoida selle lihtsana ja kasutada standardlahendust.

Peagi selgus aga, et välise süsteemi abil Dynamics AX-i poolt aktsepteeritava XML-i genereerimisega oli palju probleeme. Dynamics AX-i genereeritud XML-skeem on üsna keeruline ja tundub, et Dynamics AX-is on ka paar viga, mis mõnikord panevad selle teiste tööriistade järgi skeemikohase XML-i tagasi lükkama, seega osutus see kokkuvõttes vähem lihtsaks, kui ma arvasin.

Selle käigus oli mul tihti raskusi teatud XML-failide täpse probleemi väljaselgitamisega, kuna AIF-i edastatud veateated pole just kõige informatiivsemad. See oli ka tüütu, sest pidin ootama, kuni väline süsteem saadab MSMQ kaudu uue teate ja seejärel uuesti, kuni AIF teate vastu võtab ja töötleb, enne kui ma veateadet nägin.

Seetõttu uurisin, kas teenusekoodi on võimalik kohaliku XML-failiga otse kutsuda, et testimist mõnevõrra kiiremini teha, ja selgus, et see on võimalik – ja lisaks sellele on see väga lihtne ning annab tegelikult palju sisukamaid veateateid.

Allolev näidisülesanne loeb kohalikku XML-faili ja proovib seda kasutada koos AxdCustomer klassiga (mis on CustCustomer teenuse poolt kasutatav dokumendiklass) kliendi loomiseks. Vajadusel saate luua sarnaseid töid kõigi teiste dokumendiklasside, näiteks AxdSalesOrderi jaoks.

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() tagastatud AifEntityKey objekt (mis vastab AIF-i teenuse "create" toimingule) sisaldab teavet selle kohta, milline klient loodi, muu hulgas loodud CustTable kirje RecId.

Kui proovite testida hoopis väljaminevat porti või vajate lihtsalt näidet, kuidas XML peaks sissetuleva pordi puhul välja nägema, saate kliendi faili eksportimiseks kasutada ka dokumendiklassi, kutsudes välja meetodi read() (mis vastab teenuse "read" toimingule), näiteks nii:

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 numbri „123456” asendama kliendi kontonumbriga, kelle andmeid soovite lugeda.

Lisalugemist

Kui see postitus teile meeldis, võivad teile meeldida ka need soovitused:


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

Mikkel Christensen

Autorist

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