Kuidas itereerida X++ koodi enumi elemente rakenduses Dynamics AX 2012
Avaldatud: 15. veebruar 2025, kell 23:10:12 UTC
Selles artiklis selgitatakse, kuidas Dynamics AX-i 2012 põhiloendi elemente loetleda ja üle korrata, sealhulgas X++ koodinäidet.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Selles postituses olev teave põhineb Dynamics AX-i 2012 R3-l. See võib teiste versioonide jaoks kehtida, kuid ei pruugi kehtida.
Lõin hiljuti vormi, mis pidi kuvama loendi iga elemendi väärtuse. Selle asemel, et väljad käsitsi luua (ja seejärel vormi säilitada, kui loendit kunagi muudetakse), otsustasin selle dünaamiliselt juurutada, et see lisaks väljad käivitamise ajal kujundusse automaatselt.
Siiski avastasin peagi, et tegelikult väärtuste kordamine loendis, kuigi see on piisavalt lihtne, kui tead, kuidas seda teha, on veidi segane.
Ilmselgelt peate alustama DictEnumi klassist. Nagu näete, on sellel klassil mitu meetodit teabe saamiseks, nagu nimi ja silt nii indeksist kui ka väärtusest.
Indeksi ja väärtuse erinevus seisneb selles, et indeks on elemendi number loendis, kui loendi elemendid nummerdati järjestikku, alustades nullist, samas kui väärtus on elemendi tegelik "väärtuse" 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 sa tead, millised väärtused enumil on? Siin lähebki segaseks. Klassil DictEnum on meetod, mida nimetatakse väärtusteks (). Võib eeldada, et see meetod tagastab loendi väärtuste loendi, kuid see oleks ilmselgelt liiga lihtne, nii et selle asemel tagastab see loendis sisalduvate väärtuste arvu . Väärtuste arvul pole aga tegelike väärtustega midagi pistmist, seega peate seda numbrit kasutama indeksipõhiste, mitte väärtuspõhiste meetodite kutsumisel.
Kui nad oleksid selle meetodi asemel nimetanud indexes(), oleks see vähem segadust tekitanud ;-)
Samuti pidage meeles, et loendi väärtused (ja ilmselt need "indeksid") algavad 0-st, erinevalt X++ massiivi- ja konteinerindeksitest, mis algavad 1-st, nii et loendis olevate 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 teabelogi loendi iga elemendi sümboli ja sildi.