Miklix

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

Iliyochapishwa: 16 Februari 2025, 11:23:33 UTC
Mara ya mwisho kusasishwa: 12 Januari 2026, 08:55:30 UTC

Katika makala haya, ninaelezea jinsi ya kupiga huduma za hati za Mfumo wa Ujumuishaji wa Programu katika Dynamics AX 2012 moja kwa moja kutoka kwa msimbo wa X++, nikiiga simu zinazoingia na zinazotoka, ambayo inaweza kurahisisha sana kupata na kurekebisha 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

Taarifa katika chapisho hili inategemea Dynamics AX 2012 R3. Huenda ikawa halali au isiwe halali kwa matoleo mengine.

Hivi majuzi nilikuwa nikimsaidia mteja kutekeleza mlango unaoingia wa Mfumo wa Ujumuishaji wa Maombi (AIF) kwa ajili ya kuunda wateja kulingana na data waliyokuwa wakipokea kutoka kwa mfumo mwingine. Kwa kuwa Dynamics AX tayari inatoa huduma ya hati ya CustCustomer, ambayo inatekeleza mantiki ya hili, tuliamua kuifanya iwe rahisi na kutumia suluhisho la kawaida.

Hata hivyo, ilibainika haraka kwamba kulikuwa na matatizo mengi ya kupata mfumo wa nje ili kutoa XML ambayo Dynamics AX ingekubali. Mchoro wa XML uliozalishwa na Dynamics AX ni mgumu sana na pia inaonekana kuna hitilafu chache katika Dynamics AX ambazo wakati mwingine husababisha kukataa XML ambayo ni halali kulingana na zana zingine, kwa hivyo kwa ujumla, ilithibitika kuwa rahisi kidogo kuliko nilivyofikiria.

Wakati wa jaribio hilo, mara nyingi nilijitahidi kujua tatizo lilikuwa nini hasa na faili fulani za XML kwa sababu ujumbe wa hitilafu unaotolewa na AIF hautoi taarifa nyingi. Pia ilikuwa ya kuchosha, kwa sababu ilinibidi kusubiri mfumo wa nje utume ujumbe mpya kupitia MSMQ na kisha tena AIF ichukue ujumbe na kuuchakata kabla sijaona hitilafu.

Kwa hivyo nilichunguza kama inawezekana kupiga msimbo wa huduma moja kwa moja na faili ya XML ya ndani kwa ajili ya upimaji wa haraka zaidi na ikabainika kuwa inawezekana - na si hivyo tu, ni rahisi sana kufanya na kwa kweli hutoa ujumbe mwingi wa hitilafu wenye maana zaidi.

Mfano wa kazi hapa chini unasoma faili ya XML ya ndani na hujaribu kuitumia na darasa la AxdCustomer (ambalo ni darasa la hati linalotumiwa na huduma ya CustCustomer) ili kuunda mteja. Unaweza kufanya kazi zinazofanana 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 kinachorejeshwa na mbinu ya customer.create() (ambayo inalingana na operesheni ya huduma ya "kuunda" katika AIF) kina taarifa kuhusu mteja gani aliyeundwa, miongoni mwa mambo mengine ni RecId ya rekodi ya CustTable iliyoundwa.

Ikiwa unachojaribu kujaribu ni mlango wa Kutoka badala yake au ikiwa unahitaji tu mfano wa jinsi XML inavyopaswa kuonekana kwenye mlango wa Kuingia, unaweza pia kutumia darasa la hati kusafirisha mteja hadi faili badala yake kwa kuita mbinu ya read() (inayolingana na operesheni ya huduma ya "kusoma") badala yake, kama vile:

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

Bila shaka unapaswa kubadilisha '123456' na nambari ya akaunti ya mteja unayetaka kusoma.

Kusoma Zaidi

Ikiwa ulifurahia chapisho hili, unaweza pia kupenda mapendekezo haya:


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

Mikkel Christensen

Kuhusu Mwandishi

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