Miklix

Kuita Huduma za Hati za AIF moja kwa moja kutoka X++ katika Dynamics AX 2012

Iliyochapishwa: 16 Februari 2025, 11:23:33 UTC

Katika makala hii, ninaelezea jinsi ya kupiga simu Huduma za Hati ya Ushirikiano wa Maombi katika Dynamics AX 2012 moja kwa moja kutoka kwa nambari ya X++, kuiga simu zinazoingia na zinazotoka, ambazo zinaweza kufanya iwe rahisi sana kupata na kutatua makosa katika msimbo wa AIF.


Ukurasa huu ulitafsiriwa kwa mashine kutoka kwa Kiingereza ili kuifanya iweze kupatikana kwa watu wengi iwezekanavyo. Kwa bahati mbaya, utafsiri wa mashine bado sio teknolojia iliyokamilishwa, kwa hivyo makosa yanaweza kutokea. Ukipenda, unaweza kutazama toleo asili la Kiingereza hapa:

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

Habari katika chapisho hili inategemea Dynamics AX 2012 R3. Inaweza au haiwezi kuwa halali kwa matoleo mengine.

Hivi karibuni nilikuwa nikimsaidia mteja kutekeleza Mfumo wa Ushirikiano wa Maombi (AIF) bandari ya ndani kwa kuunda wateja kulingana na data waliyokuwa wakipokea kutoka kwa mfumo mwingine. Kama Dynamics AX tayari hutoa huduma ya hati ya CustCustomer, ambayo inatekeleza mantiki ya hii, tuliamua kuiweka rahisi na kutumia suluhisho la kawaida.

Hata hivyo, hivi karibuni ikawa kwamba kulikuwa na matatizo mengi kupata mfumo wa nje wa kuzalisha XML ambayo Dynamics AX ingekubali. Muundamano wa XML unaozalishwa na Dynamics AX ni ngumu sana na pia inaonekana kuna mende chache katika Dynamics AX ambayo wakati mwingine husababisha kukataa XML ambayo ni ya muundamano-valid kulingana na zana zingine, kwa hivyo yote kwa yote, imeonekana kuwa rahisi zaidi kuliko nilivyofikiria.

Wakati wa jitihada, mara nyingi nilijitahidi kujua tatizo lilikuwa nini hasa na faili fulani za XML kwa sababu ujumbe wa hitilafu uliotolewa na AIF ni mdogo kuliko kuelimisha. Pia ilikuwa ya kuchosha, kwa sababu ilibidi nisubiri mfumo wa nje kutuma ujumbe mpya juu ya MSMQ na kisha tena kwa AIF kuchukua ujumbe na kuichakata kabla sijaona kosa.

Kwa hivyo nilichunguza ikiwa inawezekana kupiga nambari ya huduma moja kwa moja na faili ya XML ya ndani kwa upimaji wa haraka na inageuka kuwa ni - na sio hiyo tu, ni rahisi sana kufanya na kwa kweli hutoa ujumbe mwingi wa makosa zaidi.

Kazi ya mfano hapa chini inasoma faili ya XML ya ndani na inajaribu kuitumia na darasa la AxdCustomer (ambayo ni darasa la hati linalotumiwa na huduma ya CustCustomer) kuunda mteja. Unaweza kufanya kazi sawa kwa madarasa mengine yote ya hati, kwa mfano AxdSalesOrder, ikiwa unahitaji.

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

Kitu cha AifEntityKey kilichorejeshwa na njia ya mteja.create() (ambayo inalingana na operesheni ya huduma ya "kuunda" katika AIF) ina habari kuhusu mteja gani aliundwa, kati ya mambo mengine RecId ya rekodi ya CustTable iliyoundwa.

Ikiwa unachojaribu kujaribu ni bandari ya nje badala yake au ikiwa unahitaji tu mfano wa jinsi XML inapaswa kuonekana kama kwenye bandari inayoingia, unaweza pia kutumia darasa la hati kusafirisha mteja kwenye faili badala yake kwa kupiga simu kwa njia ya kusoma() (kulingana na operesheni ya huduma ya "kusoma") badala yake, Kama hivyo:

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

Unapaswa kubadilisha '123456' na nambari ya akaunti ya mteja unayetaka kusoma.

Shiriki kwenye BlueskyShiriki kwenye FacebookShiriki kwenye LinkedInShiriki kwenye TumblrShiriki kwenye XShiriki kwenye LinkedInBandika kwenye Pinterest

Mikkel Bang Christensen

Kuhusu Mwandishi

Mikkel Bang Christensen
Mikkel ndiye muundaji na mmiliki wa miklix.com. Ana uzoefu wa zaidi ya miaka 20 kama mtaalamu wa kupanga programu/programu za kompyuta na kwa sasa ameajiriwa muda wote kwa shirika kubwa la IT la Ulaya. Wakati si kublogi, yeye hutumia wakati wake wa ziada kwenye safu nyingi za mapendeleo, vitu vya kufurahisha, na shughuli, ambazo zinaweza kuonyeshwa kwa kadiri fulani katika mada anuwai zinazozungumziwa kwenye wavuti hii.