Miklix

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

Julkaistu: 16. helmikuuta 2025 klo 11.22.57 UTC

Tässä artikkelissa selitän, kuinka voit kutsua Dynamics AX 2012:n Application Integration Framework -asiakirjapalveluita suoraan X++-koodista emuloimalla sekä saapuvia että lähteviä puheluita, mikä voi helpottaa huomattavasti AIF-koodin virheiden löytämistä ja virheenkorjausta.


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:een. Se voi tai ei välttämättä ole voimassa muille versioille.

Auttelin äskettäin asiakasta ottamaan käyttöön Application Integration Frameworkin (AIF) saapuvan portin asiakkaiden luomiseksi toisesta järjestelmästä saamansa datan perusteella. Koska Dynamics AX tarjoaa jo asiakasasiakasdokumenttipalvelun, joka toteuttaa tämän logiikan, päätimme pitää sen yksinkertaisena ja käyttää vakioratkaisua.

Pian kuitenkin kävi ilmi, että oli paljon ongelmia saada ulkoinen järjestelmä luomaan XML:ää, jonka Dynamics AX hyväksyisi. Dynamics AX:n luoma XML-skeema on melko monimutkainen, ja näyttää myös siltä, ​​että Dynamics AX:ssä on vain vähän bugeja, jotka joskus saavat sen hylkäämään muiden työkalujen mukaan skeemakelvollisen XML:n, joten kaiken kaikkiaan se osoittautui vähemmän yksinkertaiseksi kuin luulin.

Yrityksen aikana minulla oli usein vaikeuksia selvittää, mikä tiettyjen XML-tiedostojen ongelma tarkalleen oli, koska AIF:n antamat virheilmoitukset ovat vähemmän informatiivisia. Se oli myös tylsää, koska minun piti odottaa, että ulkoinen järjestelmä lähettää uuden viestin MSMQ:n kautta ja sitten taas AIF poimii viestin ja käsittelee sen ennen kuin näin virheen.

Siksi tutkin, onko mahdollista kutsua palvelukoodia suoraan paikallisella XML-tiedostolla nopeuttaakseen testausta ja kävi ilmi, että se on - eikä vain, se on todella yksinkertainen tehdä ja antaa itse asiassa paljon merkityksellisempiä virheilmoituksia.

Alla oleva esimerkkityö lukee paikallista XML-tiedostoa ja yrittää käyttää sitä AxdCustomer-luokan (joka on Asiakasasiakaspalvelun käyttämä asiakirjaluokka) kanssa asiakkaan luomiseen. Voit tarvittaessa tehdä samanlaisia ​​töitä kaikille muille dokumenttiluokille, esimerkiksi 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');
}

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

Jos yrität testata sen sijaan lähtevää porttia tai jos tarvitset vain esimerkin siitä, miltä XML:n pitäisi näyttää sisääntulevassa portissa, voit myös käyttää dokumenttiluokkaa viemään asiakkaan tiedostoon sen sijaan kutsumalla read()-metodia (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 tietysti korvata '123456' sen asiakkaan tilinumerolla, jonka haluat lukea.

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

Mikkel Bang Christensen

Kirjoittajasta

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