Kako ponoviti elemente enuma iz kode X++ v Dynamics AX 2012
Objavljeno: 15. februar 2025 ob 11:10:58 pop. UTC
Ta članek pojasnjuje, kako oštevilčiti in prebrati elemente osnovnega enuma v Dynamics AX 2012, vključno s primerom kode X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informacije v tej objavi temeljijo na Dynamics AX 2012 R3. Lahko velja ali ne velja za druge različice.
Nedavno sem ustvarjal obrazec, ki je moral prikazati vrednost za vsak element v naštevanju. Namesto ročnega ustvarjanja polj (in nato potrebe po vzdrževanju obrazca, če je enum kdaj spremenjen), sem se odločil, da ga implementiram dinamično, tako da bo samodejno dodal polja v načrt med izvajanjem.
Vendar sem kmalu odkril, da je dejansko ponavljanje vrednosti v enumu, čeprav je dovolj enostavno, ko veš, kako, nekoliko zmedeno.
Očitno morate začeti z razredom DictEnum. Kot boste videli, ima ta razred več metod za pridobivanje informacij, kot sta ime in oznaka iz indeksa in vrednosti.
Razlika med indeksom in vrednostjo je v tem, da je indeks številka elementa v enumu, če so bili elementi enuma oštevilčeni zaporedno od nič, medtem ko je vrednost dejanska lastnost "vrednosti" elementa. Ker ima večina enumov vrednosti, oštevilčene z zaporedno številko 0, bosta indeks in vrednost elementa pogosto enaka, zagotovo pa ne vedno .
Toda kako veste, katere vrednosti ima enum? Tu pride do zmede. Razred DictEnum ima metodo, imenovano values(). Morda bi pričakovali, da bo ta metoda vrnila seznam vrednosti enuma, vendar bi bilo to očitno prelahko, zato namesto tega vrne število vrednosti, ki jih enum vsebuje. Vendar pa število vrednosti nima nobene zveze z dejanskimi vrednostmi, zato morate to številko uporabiti kot osnovo za klicanje metod, ki temeljijo na indeksu, ne tistih, ki temeljijo na vrednosti.
Če bi to metodo namesto tega poimenovali indexes(), bi bilo manj zmedeno ;-)
Upoštevajte tudi, da se vrednosti enum (in očitno ti "indeksi") začnejo pri 0, v nasprotju z indeksi matrik in vsebnikov v X++, ki se začnejo pri 1, tako da lahko za zanko po elementih v enum naredite nekaj takega:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
To bo izpisalo simbol in oznako vsakega elementa v enum v infolog.