Miklix

Kuidas itereerida X++ koodi enumi elemente rakenduses Dynamics AX 2012

Avaldatud: 15. veebruar 2025, kell 23:10:12 UTC
Viimati uuendatud: 12. jaanuar 2026, kell 08:41:55 UTC

See artikkel selgitab, kuidas Dynamics AX 2012 baasloendi elemente loetleda ja tsükliga üle käia, sh X++ koodi näide.


See lehekülg on inglise keelest masintõlgitud, et muuta see võimalikult paljudele inimestele kättesaadavaks. Kahjuks ei ole masintõlge veel täiuslik tehnoloogia, mistõttu võivad esineda vead. Kui soovite, võite vaadata ingliskeelset originaalversiooni siin:

How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012

Selle postituse teave põhineb Dynamics AX 2012 R3-l. See ei pruugi kehtida teiste versioonide puhul.

Hiljuti lõin vormi, mis pidi kuvama iga loendi elemendi väärtuse. Selle asemel, et välju käsitsi luua (ja seejärel vormi hallata, kui loendit muudetakse), otsustasin selle dünaamiliselt rakendada, nii et see lisaks väljad automaatselt kujundusele käitusajal.

Peagi avastasin aga, et enumi väärtuste üle kordamine on küllaltki lihtne, kui sa selle selgeks teed, aga veidi segadusttekitav.

Ilmselgelt tuleb alustada DictEnum klassiga. Nagu näete, on sellel klassil mitu meetodit teabe (nt nime ja sildi) hankimiseks nii indeksist kui ka väärtusest.

Indeksi ja väärtuse erinevus seisneb selles, et indeks on elemendi number enumis, kui enumi elemendid nummerdatakse järjestikku alates nullist, samas kui väärtus on elemendi tegelik "väärtus" omadus. Kuna enamiku enumite väärtused on nummerdatud järjestikku alates nullist, on elemendi indeks ja väärtus sageli samad, kuid kindlasti mitte alati.

Aga kuidas teada saada, millised väärtused enumil on? Siin läheb asi segaseks. DictEnum klassil on meetod nimega values(). Võiks eeldada, et see meetod tagastab enumi väärtuste loendi, aga see oleks ilmselgelt liiga lihtne, seega tagastab see hoopis enumis sisalduvate väärtuste arvu. Väärtuste arvul pole aga tegelike väärtustega mingit pistmist, seega tuleb indeksipõhiste meetodite kutsumiseks alusena kasutada seda arvu, mitte väärtuspõhiste meetodite kutsumiseks.

Kui nad oleksid selle meetodi nimetanud hoopis indexes(), oleks see vähem segane olnud ;-)

Samuti pidage meeles, et enumi väärtused (ja ilmselt ka need "indeksid") algavad 0-st, erinevalt X++ massiivi- ja konteinerindeksitest, mis algavad 1-st, seega enumi elementide ületamiseks võiksite teha midagi sellist:

DictEnum dictEnum = new DictEnum(enumNum(SalesStatus));
Counter  c;
;

for (c = 0; c < dictEnum.values(); c++)
{
    info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}

See väljastab iga enumi elemendi sümboli ja sildi infologi.

Lisalugemist

Kui see postitus teile meeldis, võivad teile meeldida ka need soovitused:


Jagage Bluesky'sJaga FacebookisJagage LinkedInisJaga TumblrisJaga X-isJagage LinkedInisKinnitage Pinterestis

Mikkel Christensen

Autorist

Mikkel Christensen
Mikkel on miklix.com looja ja omanik. Tal on üle 20 aasta kogemust professionaalse programmeerija/tarkvaraarendajana ning praegu töötab ta täiskohaga suures Euroopa IT-ettevõttes. Kui ta ei kirjuta blogi, veedab ta oma vaba aega mitmesuguste huvide, hobide ja tegevustega, mis võib mingil määral kajastuda sellel veebisaidil käsitletavate teemade mitmekesisuses.