Cómo iterar sobre los elementos de una enumeración desde el código X++ en Dynamics AX 2012
Publicado: 15 de febrero de 2025, 23:10:09 UTC
Este artículo explica cómo enumerar y recorrer los elementos de una enumeración base en Dynamics AX 2012, incluido un ejemplo de código X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
La información de este artículo se basa en Dynamics AX 2012 R3. Puede que sea válida o no para otras versiones.
Recientemente, creé un formulario que debía mostrar un valor para cada elemento de una enumeración. En lugar de crear manualmente los campos (y luego tener que mantener el formulario si alguna vez se modifica la enumeración), decidí implementarlo de forma dinámica para que agregara automáticamente los campos al diseño en tiempo de ejecución.
Sin embargo, pronto descubrí que iterar sobre los valores de una enumeración, si bien es bastante fácil una vez que sabes cómo, es un poco confuso.
Obviamente, debes comenzar con la clase DictEnum. Como verás, esta clase tiene varios métodos para obtener información, como el nombre y la etiqueta, tanto del índice como del valor.
La diferencia entre índice y valor es que índice es el número de un elemento en la enumeración, si los elementos de la enumeración se numeraron secuencialmente comenzando desde cero, mientras que valor es la propiedad "valor" real del elemento. Como la mayoría de las enumeraciones tienen valores numerados secuencialmente desde 0, el índice y el valor de un elemento a menudo serán los mismos, pero ciertamente no siempre .
Pero, ¿cómo sabes qué valores tiene una enumeración? Aquí es donde se vuelve confuso. La clase DictEnum tiene un método llamado values(). Podrías esperar que este método devuelva una lista de los valores de la enumeración, pero eso sería obviamente demasiado fácil, por lo que en su lugar devuelve el número de valores que contiene la enumeración. Sin embargo, el número de valores no tiene nada que ver con los valores reales, por lo que debes usar este número como base para llamar a los métodos basados en índices, no a los basados en valores.
Si hubieran llamado a este método indexes(), habría sido menos confuso ;-)
También tenga en cuenta que los valores de enumeración (y aparentemente estos "índices") comienzan en 0, a diferencia de los índices de matriz y contenedor en X++, que comienzan en 1, por lo que para recorrer los elementos de una enumeración podría hacer algo como esto:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Esto mostrará el símbolo y la etiqueta de cada elemento de la enumeración en el registro de información.