Miklix

Kutumia Mfumo wa SysExtension ili kujua ni darasa gani ndogo la instantiate katika Dynamics AX 2012

Iliyochapishwa: 16 Februari 2025, 00:26:12 UTC
Mara ya mwisho kusasishwa: 12 Januari 2026, 08:43:29 UTC

Makala haya yanaelezea jinsi ya kutumia mfumo wa SysExtension usiojulikana sana katika Dynamics AX 2012 na Dynamics 365 kwa Operesheni ili kuanzisha madarasa madogo kulingana na mapambo ya sifa, na kuruhusu muundo unaoweza kupanuliwa kwa urahisi wa safu ya tabaka la usindikaji.


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:

Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012

Taarifa katika chapisho hili inategemea Dynamics AX 2012 R3. Huenda ikawa halali au isiwe halali kwa matoleo mengine. (Sasisho: Ninaweza kuthibitisha kwamba taarifa katika makala haya pia ni halali kwa Dynamics 365 kwa Uendeshaji)

Unapotekeleza madarasa ya usindikaji katika Dynamics AX, mara nyingi unakabiliwa na kuunda safu ya darasa ambapo kila darasa ndogo linalingana na thamani ya enum au lina muunganisho mwingine wa data. Muundo wa kawaida ni kuwa na mbinu ya ujenzi katika darasa la super, ambalo lina swichi inayoamua ni darasa gani la kuanzisha kulingana na ingizo.

Hii inafanya kazi vizuri kimsingi, lakini ikiwa una pembejeo nyingi tofauti zinazowezekana (vipengele vingi katika enum au labda pembejeo ni mchanganyiko wa thamani kadhaa tofauti), inaweza kuwa ya kuchosha na yenye uwezekano wa makosa kudumisha na muundo huwa na hasara kwamba utahitaji kurekebisha njia hiyo ya ujenzi ikiwa utaongeza darasa ndogo mpya au kufanya mabadiliko kwa darasa ndogo gani inapaswa kutumika kulingana na ingizo gani.

Kwa bahati nzuri, kuna njia ya kifahari zaidi, lakini kwa bahati mbaya pia isiyojulikana sana, ya kufanya hivi, yaani kwa kutumia mfumo wa SysExtension.

Mfumo huu unatumia sifa unazoweza kutumia kupamba madarasa yako madogo ili kuufanya mfumo uweze kubaini ni darasa gani ndogo linalopaswa kutumika kushughulikia nini. Bado utahitaji mbinu ya ujenzi, lakini ikifanywa kwa usahihi, hutawahi kulazimika kuibadilisha unapoongeza madarasa mapya madogo.

Hebu tuangalie mfano wa kufikirika na tuseme kwamba utatekeleza mpangilio wa kazi unaofanya aina fulani ya usindikaji kulingana na jedwali la InventTrans. Uchakataji upi wa kufanya unategemea StatusReceipt na StatusIssue ya rekodi, na pia kama rekodi zinahusiana na SalesLine, PurchLine au hakuna. Tayari sasa, unaangalia michanganyiko mingi tofauti.

Tuseme kwamba unajua kwamba kwa sasa unahitaji tu kushughulikia michanganyiko michache, lakini pia unajua kwamba utaombwa kuweza kushughulikia michanganyiko zaidi na zaidi baada ya muda.

Tuifanye iwe rahisi na tuseme kwamba kwa sasa unahitaji tu kushughulikia rekodi zinazohusiana na SalesLine na Hali ya Suala la ReservPhysical au ReservOrdered, michanganyiko mingine yote inaweza kupuuzwa kwa sasa, lakini kwa kuwa unajua utalazimika kuishughulikia baadaye, utahitaji kubuni msimbo wako kwa njia ambayo itaufanya uweze kupanuka kwa urahisi.

Uongozi wako unaweza kuonekana kama hivi kwa sasa:

  • Kichakataji ChanguMauzo_Ya_Kichakataji_ChanguMauzo_Ya_Kichakataji_ChanguKihifadhi_Cha_Mauzo_Ya_Kiwango

Sasa, unaweza kutekeleza kwa urahisi mbinu katika darasa kuu inayoanzisha darasa ndogo kulingana na ModuleInventPurchSales na enum ya StatusIssue. Lakini utahitaji kurekebisha darasa kuu kila wakati unapoongeza darasa ndogo, na hilo sio wazo la urithi katika programu inayolenga vitu. Baada ya yote, huhitaji kurekebisha RunBaseBatch au SysOperationServiceBase kila wakati unapoongeza kazi mpya ya kundi.

Badala yake, unaweza kutumia mfumo wa SysExtension. Hiyo itahitaji kuongeza darasa lingine, ambalo linahitaji kupanua SysAttribute. Darasa hili litatumika kama sifa unayoweza kupamba madarasa yako ya usindikaji nayo.

Darasa hili linafanana sana na jinsi unavyoweza kutengeneza darasa la mkataba wa data kwa ajili ya utekelezaji wa SysOperation, kwa kuwa litakuwa na baadhi ya wanachama wa data na mbinu za parm za kupata na kuweka thamani hizo.

Katika kesi yetu, ClassDeclaration inaweza kuonekana kama hii:

class MyProcessorSystemAttribute extends SysAttribute
{
    ModuleInventPurchSales  module;
    StatusIssue             statusIssue;
    StatusReceipt           statusReceipt
}

Unahitaji kutengeneza mbinu mpya () ya kuakibisha wanachama wote wa data. Ukitaka unaweza kuwapa baadhi au wote thamani chaguo-msingi, lakini sijafanya hivyo.

public void new(ModuleInventPurchSales  _module,
                StatusIssue             _statusIssue,
                StatusReceipt           _statusReceipt)
{
    ;

    super();

    module          = _module;
    statusIssue     = _statusIssue;
    statusReceipt   = _statusReceipt;
}

Na unapaswa pia kutekeleza mbinu ya parm kwa kila mwanachama wa data, lakini nimeziacha hapa kwani nina uhakika unajua jinsi ya kufanya hivyo - vinginevyo, hebu tuichukulie kama zoezi ;-)

Sasa unaweza kutumia darasa lako la sifa kupamba kila moja ya madarasa yako ya usindikaji. Kwa mfano, matamko ya darasa yanaweza kuonekana kama hii:

[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
                            StatusIssue::None,
                            StatusReceipt::None)]
class MyProcessor_Sales extends MyProcessor
{
}

[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
                            StatusIssue::ReservOrdered,
                            StatusReceipt::None)]
class MyProcessor_Sales_ReservOrdered extends MyProcessor_Sales
{
}

[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
                            StatusIssue::ReservPhysical,
                            StatusReceipt::None)]
class MyProcessor_Sales_ReservPhysical extends MyProcessor_Sales
{
}

Bila shaka unaweza kutaja madarasa yako kwa njia yoyote unayotaka, sehemu muhimu hapa ni kwamba upambe madarasa yako kwa sifa zinazolingana na aina ya usindikaji wanayofanya. (Lakini kumbuka kwamba kuna kanuni za majina kwa ajili ya uongozi wa madarasa katika Dynamics AX na daima ni wazo zuri kufuata hizo, ikiwezekana).

Sasa kwa kuwa umepamba madarasa yako ili kubaini aina ya usindikaji ambayo kila moja hufanya, unaweza kutumia mfumo wa SysExtension ili kubainisha vipengee vya madarasa madogo kama inavyohitajika.

Katika darasa lako bora (MyProcessor), unaweza kuongeza njia ya ujenzi kama hii:

public static MyProcessor construct(ModuleInventPurchSales _module,
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
    MyProcessor                 ret;
    MyProcessorSystemAttribute  attribute;
    ;

    attribute = new MyProcessorSystemAttribute( _module,
                                                _statusIssue,
                                                _statusReceipt);

    ret = SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(MyProcessor), attribute);

    if (!ret)
    {
        //  no class found
        //  here you could throw an error, instantiate a default
        //  processor instead, or just do nothing, up to you
    }

    return ret;
}

Sehemu ya kuvutia sana - na kwa kweli kitu (samahani kwa maneno ya kuchekesha) cha chapisho hili lote - ni mbinu ya getClassFromSysAttribute() katika darasa la SysExtensionAppClassFactory. Kinachofanya njia hii ni kwamba inakubali jina la darasa kuu la uongozi (na darasa hili kuu halihitaji kuwa juu ya uongozi; ina maana tu kwamba madarasa yanayopanua darasa hili pekee ndiyo yatakayostahiki) na kitu cha sifa.

Kisha hurejesha kitu cha darasa kinachopanua darasa kuu lililotajwa na kupambwa kwa sifa inayolingana.

Bila shaka unaweza kuongeza uthibitisho au mantiki zaidi kwenye mbinu ya ujenzi upendavyo, lakini jambo muhimu hapa ni kwamba mara tu itakapotekelezwa, hupaswi kamwe kurekebisha njia hii tena. Unaweza kuongeza madarasa madogo kwenye uongozi na mradi tu unahakikisha unayapamba ipasavyo, mbinu ya ujenzi itayapata ingawa hayakuwepo wakati yalipoandikwa.

Vipi kuhusu utendaji? Kwa kweli sijajaribu kuulinganisha, lakini hisia yangu ya ndani ni kwamba hii labda inafanya kazi vibaya zaidi kuliko muundo wa taarifa ya swichi ya kawaida. Hata hivyo, kwa kuzingatia kwamba kwa kiasi kikubwa matatizo mengi ya utendaji katika Dynamics AX husababishwa na ufikiaji wa hifadhidata, nisingejali sana kuhusu hilo.

Bila shaka, ikiwa unatekeleza kitu ambacho kitahitaji maelfu ya vitu kuundwa haraka, unaweza kutaka kuchunguza zaidi, lakini katika hali za kawaida ambapo unaanzisha tu kitu kimoja kufanya usindikaji mrefu, sina shaka itakuwa muhimu. Pia, kwa kuzingatia ushauri wangu wa utatuzi wa matatizo (aya inayofuata), inaonekana kwamba mfumo wa SysExtension unategemea hifadhi ya data, kwa hivyo katika mfumo unaoendesha nina shaka una matokeo makubwa ya utendaji.

Utatuzi wa Matatizo: Ikiwa mbinu ya ujenzi haipati madarasa yako madogo hata kama una uhakika yamepambwa kwa usahihi, inaweza kuwa tatizo la kuhifadhi data. Jaribu kufuta kashe kwenye mteja na seva. Haipaswi kuwa muhimu kuanzisha tena AOS, lakini inaweza kuwa suluhisho la mwisho.

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.