Como iterar sobre os elementos de um Enum do código X++ no Dynamics AX 2012
Publicado: 15 de fevereiro de 2025 às 23:10:53 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. Podem ou não ser válidas para outras versões.
Recentemente, eu estava criando um formulário que precisava exibir um valor para cada elemento em um enum. Em vez de criar manualmente os campos (e então precisar manter o formulário se o enum for modificado), decidi implementá-lo dinamicamente para que ele adicionasse automaticamente os campos ao design em tempo de execução.
No entanto, logo descobri que iterar sobre os valores de uma enumeração, embora seja fácil quando você sabe como, é um pouco confuso.
Obviamente, você precisa começar com a classe DictEnum. Como você verá, essa classe tem vários métodos para obter informações como nome e rótulo tanto do índice quanto do valor.
A diferença entre index e value é que index é um número de elemento na enumeração, se os elementos da enumeração fossem numerados sequencialmente a partir de zero, enquanto value é a propriedade "value" real do elemento. Como a maioria das enumerações tem valores numerados sequencialmente a partir de 0, o index e o value de um elemento frequentemente serão os mesmos, mas certamente não sempre .
Mas como você sabe quais valores um enum tem? É aqui que fica confuso. A classe DictEnum tem um método chamado values(). Você pode esperar que esse método retorne uma lista dos valores do enum, mas isso obviamente seria muito fácil, então, em vez disso, ele retorna o número de valores que o enum contém. No entanto, o número de valores não tem nada a ver com os valores reais, então você precisa usar esse número como base para chamar os métodos baseados em índice, não os baseados em valor.
Se ao menos tivessem chamado esse método de indexes(), teria sido menos confuso ;-)
Tenha em mente também que os valores de enumeração (e aparentemente esses "índices") começam em 0, diferentemente dos índices de array e container no X++, que começam em 1, então para fazer um loop pelos elementos em uma enumeração você pode fazer algo assim:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Isso produzirá o símbolo e o rótulo de cada elemento na enumeração para o infolog.