Kako ponoviti elemente enuma iz Ks ++ koda u Dinamics AKS KSNUMKS
Objavio: 19. mart 2025. 21:32:58 UTC
Ovaj članak objašnjava kako nabrojati i petljati preko elemenata osnovnog enuma u Dinamics AKS 2012, uključujući primer Ks ++ koda.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informacije u ovom postu zasnovane su na Dynamics AX 2012 R3. Mogu biti ili ne biti važeće za druge verzije.
Nedavno sam pravio formu koja je trebalo da prikazuje vrednost za svaki element u enumu. Umesto da ručno kreiram polja (i onda moram da održavam formu ako se enum ikada izmeni), odlučio sam da implementiram dinamički, tako da će polja automatski biti dodata u dizajn prilikom izvođenja.
Međutim, ubrzo sam otkrio da je zapravo iteriranje kroz vrednosti u enumu, dok je dovoljno lako kada znaš kako, pomalo zbunjujuće.
Očigledno treba da počneš sa klasom DictEnum. Kao što ćeš videti, ova klasa ima nekoliko metoda za dobijanje informacija kao što su ime i oznaka sa oba indeksa i vrednosti.
Razlika između indeksa i vrednosti je u tome što je indeks broj elementa u enumu, ako bi elementi enum-a bili numerisani sekvencijalno počevši od nule, dok je vrednost stvarna "vrednost" svojstva elementa. Kako većina enum-a ima vrednosti numerisane sekvencijalno od 0, indeks i vrednost elementa će često biti isti, ali sigurno ne uvek.
Ali kako da znaš koje vrednosti ima enum? Tu postaje zbunjujuće. Klasa DictEnum ima metodu pod nazivom values(). Možda bi očekivao da ova metoda vrati listu vrednosti enum-a, ali to bi očigledno bilo previše lako, pa umesto toga vraća broj vrednosti koje enum sadrži. Međutim, broj vrednosti nema nikakve veze sa stvarnim vrednostima, pa moraš koristiti ovaj broj kao osnovu za pozivanje metoda zasnovanih na indeksima, a ne onih zasnovanih na vrednostima.
Da su samo nazvali ovu metodu indexes() umesto toga, bilo bi manje zbunjujuće ;-)
Imaj na umu da vrednosti enum-a (i očigledno ovi "indeksi") počinju od 0, za razliku od indeksa niza i kontejnera u X++, koji počinju od 1, pa da bi iterirao kroz elemente u enumu mogao bi da uradiš nešto poput ovog:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Ovo će prikazati simbol i oznaku svakog elementa u enumu na infologu.