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.
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:
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:
- AIF-i dokumenditeenustele helistamine otse rakendusest X++ rakenduses Dynamics AX 2012
- Data() ja buf2Buf() erinevus rakenduses Dynamics AX 2012
- Päringu kasutamine SysOperationi andmelepinguklassis Dynamics AX-i 2012-s
