Como iterar sobre os elementos de um Enum a partir do código X++ no Dynamics AX 2012
Publicado: 15 de fevereiro de 2025 às 23:10:55 UTC
Este artigo explica como enumerar e executar um loop sobre os elementos de uma enumeração base no Dynamics AX 2012, incluindo um exemplo de código X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
As informações neste post são baseadas no Dynamics AX 2012 R3. Pode ou não ser válido para outras versões.
Recentemente criei um formulário que necessitava de apresentar um valor para cada elemento de uma enumeração. Em vez de criar os campos manualmente (e depois precisar de manter o formulário no caso de a enumeração ser modificada), decidi implementá-lo dinamicamente para que adicionasse automaticamente os campos ao design em tempo de execução.
No entanto, cedo descobri que iterar sobre os valores de uma enumeração, embora seja fácil quando se sabe como, é um pouco confuso.
Obviamente, precisa de começar com a classe DictEnum. Como verá, esta classe tem vários métodos para obter informações como o nome e o rótulo do índice e do valor.
A diferença entre índice e valor é que índice é o número de um elemento na enumeração, se os elementos da enumeração fossem numerados sequencialmente a partir de zero, enquanto valor é a propriedade "valor" real do elemento. Como a maioria das enumerações tem valores numerados sequencialmente a partir de 0, o índice e o valor de um elemento serão geralmente os mesmos, mas certamente nem sempre .
Mas como saber que valores tem uma enumeração? É aqui que se torna confuso. A classe DictEnum possui um método chamado values(). Pode esperar que este método devolva uma lista de valores da enumeração, mas isso seria obviamente muito fácil, pelo que, em vez disso, devolve o número de valores que a enumeração contém. No entanto, o número de valores não tem nada a ver com os valores reais, pelo que é necessário utilizar este número como base para chamar os métodos baseados em índices, e não os baseados em valores.
Se ao menos tivessem chamado a este método indexes(), teria sido menos confuso ;-)
Tenha também em conta que os valores de enumeração (e aparentemente estes "índices") começam em 0, ao contrário dos índices de array e container em X++, que começam em 1, pelo que para fazer um loop pelos elementos de uma enumeração pode fazer algo do género:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Isto produzirá o símbolo e o rótulo de cada elemento na enumeração para o infolog.