Miklix

Com iterar sobre els elements d'una enumeració del codi X++ a Dynamics AX 2012

Publicat: 5 de març del 2025, a les 19:30:34 UTC

Aquest article explica com enumerar i fer un bucle sobre els elements d'una enumeració base al Dynamics AX 2012, inclòs un exemple de codi X++.


Aquesta pàgina es va traduir automàticament de l'anglès per tal de fer-la accessible al màxim de persones possible. Malauradament, la traducció automàtica encara no és una tecnologia perfeccionada, de manera que es poden produir errors. Si ho prefereixes, pots veure la versió original en anglès aquí:

How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012

La informació d'aquesta publicació es basa en Dynamics AX 2012 R3. Pot ser vàlid o no per a altres versions.

Recentment estava creant un formulari que necessitava mostrar un valor per a cada element d'una enumeració. En lloc de crear manualment els camps (i després haver de mantenir el formulari si mai es modifica l'enumeració), vaig decidir implementar-lo de manera dinàmica perquè afegeixi automàticament els camps al disseny en temps d'execució.

Tanmateix, aviat vaig descobrir que la iteració dels valors d'una enumeració, tot i que és prou fàcil un cop saps com, és una mica confús.

Òbviament, heu de començar amb la classe DictEnum. Com veureu, aquesta classe té diversos mètodes per obtenir informació com el nom i l'etiqueta tant de l'índex com del valor.

La diferència entre l'índex i el valor és que l'índex és el número d'un element a la enumeració, si els elements de l'enumeració es van numerar seqüencialment a partir de zero, mentre que el valor és la propietat "valor" real de l'element. Com que la majoria de enumeracions tenen valors numerats seqüencialment a partir de 0, l'índex i el valor d'un element sovint seran els mateixos, però certament no sempre .

Però, com saps quins valors té una enumeració? Aquí és on es fa confús. La classe DictEnum té un mètode anomenat values(). Podríeu esperar que aquest mètode torni una llista dels valors de l'enumeració, però òbviament això seria massa fàcil, de manera que, en canvi, retorna el nombre de valors que conté l'enumeració. Tanmateix, el nombre de valors no té res a veure amb els valors reals, de manera que cal que utilitzeu aquest nombre com a base per cridar els mètodes basats en l'índex, no els basats en valors.

Si només haguessin anomenat aquest mètode indexes(), hauria estat menys confús ;-)

També tingueu en compte que els valors d'enum (i aparentment aquests "índexs") comencen a 0, a diferència dels índexs de matrius i contenidors a X++, que comencen a l'1, de manera que per fer un bucle sobre els elements d'una enumeració podeu fer alguna cosa com això:

DictEnum dictEnum = new DictEnum(enumNum(SalesStatus));
Counter  c;
;

for (c = 0; c < dictEnum.values(); c++)
{
    info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}

Això mostrarà el símbol i l'etiqueta de cada element de l'enumeració a l'infolog.

Comparteix a BlueskyComparteix a FacebookComparteix a LinkedInComparteix a TumblrComparteix a XComparteix a LinkedInPin a Pinterest

Mikkel Bang Christensen

Sobre l'autor

Mikkel Bang Christensen
Mikkel és el creador i propietari de miklix.com. Té més de 20 anys d'experiència com a programador/desenvolupador de programari informàtic professional i actualment treballa a temps complet per a una gran corporació informàtica europea. Quan no fa blocs, dedica el seu temps lliure a una gran varietat d'interessos, aficions i activitats, que fins a cert punt es poden reflectir en la varietat de temes tractats en aquest lloc web.