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
Última atualização: 12 de janeiro de 2026 às 08:42:03 UTC
Este artigo explica como enumerar e percorrer 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. Elas podem ou não ser válidas para outras versões.
Recentemente, estava criando um formulário que precisava exibir um valor para cada elemento em uma enumeração. Em vez de criar os campos manualmente (e depois precisar manter o formulário caso a enumeração fosse modificada), decidi implementá-lo dinamicamente para que os campos fossem adicionados automaticamente ao design em tempo de execução.
No entanto, logo descobri que iterar sobre os valores em um enum, embora seja bastante fácil depois que você aprende como, é um pouco confuso.
Obviamente, você precisa começar com a classe DictEnum. Como você verá, essa classe possui vários métodos para obter informações como nome e rótulo, tanto a partir do índice quanto do valor.
Diferença entre índice e valor é que o índice representa o número de um elemento na enumeração, caso os elementos da enumeração fossem numerados sequencialmente a partir de zero, enquanto o valor representa o valor real do elemento. Como a maioria das enumerações possui valores numerados sequencialmente a partir de 0, o índice e o valor de um elemento geralmente serão os mesmos, mas certamente nem sempre.
Mas como saber quais valores um enum possui? É aqui que a coisa complica. A classe `DictEnum` tem um método chamado `values()`. Você poderia esperar que esse método retornasse uma lista dos valores do enum, mas isso seria obviamente fácil demais; 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 relação com os valores em si, então você precisa usar esse número como base para chamar os métodos baseados em índice, e não os baseados em valor.
Se ao menos tivessem chamado esse método de indexes(), teria sido menos confuso ;-)
Lembre-se também de que os valores de enumeração (e aparentemente esses "índices") começam em 0, diferentemente dos índices de arrays e contêineres em X++, que começam em 1. Portanto, para percorrer os elementos de uma enumeração, você poderia fazer algo como:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Isso exibirá o símbolo e o rótulo de cada elemento na enumeração no registro de informações.
Leitura adicional
Se você gostou deste post, você também pode gostar destas sugestões:
- Erro "Nenhuma classe de metadados definida para objeto de contrato de dados" no Dynamics AX 2012
- A diferença entre data() e buf2Buf() no Dynamics AX 2012
- Usando uma consulta em uma classe de contrato de dados SysOperation no Dynamics AX 2012
