Miklix

AIF-asiakirjapalveluiden soittaminen suoraan X++:sta Dynamics AX 2012:ssa

Julkaistu: 16. helmikuuta 2025 klo 11.22.57 UTC
Viimeksi päivitetty: 12. tammikuuta 2026 klo 8.55.13 UTC

Tässä artikkelissa selitän, miten Application Integration Framework -asiakirjapalveluita kutsutaan Dynamics AX 2012:ssa suoraan X++-koodista emuloimalla sekä saapuvia että lähteviä kutsuja, mikä voi helpottaa huomattavasti virheiden löytämistä ja korjaamista AIF-koodissa.


Tämä sivu on käännetty koneellisesti englannista, jotta se olisi mahdollisimman monen ihmisen saatavilla. Valitettavasti konekääntäminen ei ole vielä täydellistä tekniikkaa, joten virheitä voi esiintyä. Voit halutessasi tarkastella alkuperäistä englanninkielistä versiota täällä:

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

Tämän viestin tiedot perustuvat Dynamics AX 2012 R3 -versioon. Ne eivät välttämättä päde muihin versioihin.

Autoin hiljattain asiakasta toteuttamaan Application Integration Frameworkin (AIF) saapuvan liikenteen portin asiakkaiden luomiseksi heidän toisesta järjestelmästä vastaanottamiensa tietojen perusteella. Koska Dynamics AX tarjoaa jo CustCustomer-asiakirjapalvelun, joka toteuttaa tämän logiikan, päätimme pitää sen yksinkertaisena ja käyttää vakioratkaisua.

Pian kuitenkin kävi ilmi, että ulkoisen järjestelmän saamisessa luomaan Dynamics AX:n hyväksymää XML-koodia oli paljon ongelmia. Dynamics AX:n luoma XML-skeema on melko monimutkainen, ja näyttää myös olevan muutamia virheitä, jotka joskus saavat sen hylkäämään muiden työkalujen mukaan skeemavalidin XML-koodin, joten kaiken kaikkiaan se osoittautui vähemmän yksinkertaiseksi kuin olin luullut.

Työn aikana minulla oli usein vaikeuksia selvittää, mikä tiettyjen XML-tiedostojen ongelma tarkalleen ottaen oli, koska AIF:n antamat virheilmoitukset eivät ole kovin informatiivisia. Se oli myös työlästä, koska minun piti odottaa, että ulkoinen järjestelmä lähettää uuden viestin MSMQ:n kautta ja sitten uudelleen, että AIF poimii viestin ja käsittelee sen, ennen kuin näin virheen.

Siksi tutkin, onko mahdollista kutsua palvelukoodia suoraan paikallisella XML-tiedostolla testauksen nopeuttamiseksi, ja osoittautui, että se on mahdollista – eikä siinä kaikki, se on todella helppo tehdä ja antaa itse asiassa paljon merkityksellisempiä virheilmoituksia.

Alla oleva esimerkkityö lukee paikallisen XML-tiedoston ja yrittää käyttää sitä AxdCustomer-luokan (joka on CustCustomer-palvelun käyttämä dokumenttiluokka) kanssa asiakkaan luomiseen. Voit tarvittaessa tehdä vastaavia töitä kaikille muille dokumenttiluokille, esimerkiksi AxdSalesOrder-luokalle.

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

Customer.create()-metodin palauttama AifEntityKey-objekti (joka vastaa AIF:n "create"-palveluoperaatiota) sisältää tietoja siitä, mikä asiakas luotiin, muun muassa luodun CustTable-tietueen RecId-tunnuksen.

Jos testaat lähtevän liikenteen porttia tai tarvitset vain esimerkin siitä, miltä XML:n pitäisi näyttää saapuvan liikenteen portissa, voit myös käyttää document-luokkaa asiakkaan viemiseen tiedostoon kutsumalla read()-metodia (joka vastaa "read"-palveluoperaatiota) seuraavasti:

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

Sinun tulee tietenkin korvata '123456' sen asiakkaan tilinumerolla, jonka haluat lukea.

Lisälukemista

Jos pidit tästä postauksesta, saatat pitää myös näistä ehdotuksista:


Jaa BlueskyssäJaa FacebookissaJaa LinkedInissäJaa TumblrissaJaa X:ssäJaa LinkedInissäPin Pinterestissä

Mikkel Christensen

Kirjoittajasta

Mikkel Christensen
Mikkel on miklix.com-sivuston luoja ja omistaja. Hänellä on yli 20 vuoden kokemus ammattimaisena tietokoneohjelmoijana/ohjelmistokehittäjänä, ja tällä hetkellä hän työskentelee kokopäiväisesti suuressa eurooppalaisessa IT-yrityksessä. Kun hän ei ole bloggaamassa, hän käyttää vapaa-aikaansa monenlaisiin kiinnostuksen kohteisiin, harrastuksiin ja aktiviteetteihin, mikä saattaa jossain määrin heijastua tällä verkkosivustolla käsiteltävien aiheiden moninaisuuteen.