Kako iterirati preko elemenata enuma iz X++ koda u Dynamics AX 2012
Objavljeno: 15. veljače 2025. u 23:15:39 UTC
Ovaj članak objašnjava kako nabrojiti i preći u petlju preko elemenata osnovnog enuma u Dynamics AX 2012, uključujući primjer X++ koda.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informacije u ovom postu temelje se na Dynamics AX 2012 R3. Može, ali i ne mora vrijediti za druge verzije.
Nedavno sam stvarao obrazac koji je trebao prikazati vrijednost za svaki element u enumu. Umjesto da ručno stvaram polja (a zatim moram održavati obrazac ako se enum ikada izmijeni), odlučio sam ga implementirati dinamički tako da automatski dodaje polja dizajnu tijekom izvođenja.
Međutim, ubrzo sam otkrio da je stvarno ponavljanje vrijednosti u enumu, iako dovoljno lako kada znate kako, pomalo zbunjujuće.
Očito morate početi s klasom DictEnum. Kao što ćete vidjeti, ova klasa ima nekoliko metoda za dobivanje informacija kao što su naziv i oznaka iz indeksa i vrijednosti.
Razlika između indeksa i vrijednosti je u tome što je indeks broj elementa u enumu, ako su elementi enuma numerirani redom počevši od nule, dok je vrijednost stvarno svojstvo "vrijednosti" elementa. Kako većina enuma ima vrijednosti označene redom od 0, indeks i vrijednost elementa često će biti isti, ali sigurno ne uvijek .
Ali kako znati koje vrijednosti enum ima? Ovdje postaje zbunjujuće. Klasa DictEnum ima metodu koja se zove values(). Možete očekivati da će ova metoda vratiti popis vrijednosti enuma, ali to bi očito bilo previše lako, pa umjesto toga vraća broj vrijednosti koje enum sadrži. Međutim, broj vrijednosti nema nikakve veze sa stvarnim vrijednostima, tako da ovaj broj trebate koristiti kao osnovu za pozivanje metoda temeljenih na indeksu, a ne onih temeljenih na vrijednosti.
Da su samo ovu metodu nazvali indexes() umjesto toga, bilo bi manje zbunjujuće ;-)
Također imajte na umu da vrijednosti enuma (i očito ovi "indeksi") počinju od 0, za razliku od indeksa polja i spremnika u X++, koji počinju od 1, tako da biste prešli elemente u enumu mogli biste učiniti nešto ovako:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Ovo će ispisati simbol i oznaku svakog elementa u enumu u infolog.