Miklix

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
Última atualização: 12 de janeiro de 2026 às 08:42:04 UTC

Este artigo explica como enumerar e fazer looping sobre os elementos de um enum base no Dynamics AX 2012, incluindo um exemplo de código X++.


Esta página foi traduzida automaticamente do inglês para a tornar acessível ao maior número possível de pessoas. Infelizmente, a tradução automática ainda não é uma tecnologia aperfeiçoada, pelo que podem ocorrer erros. Se preferir, pode ver a versão original em inglês aqui:

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

A informação neste artigo baseia-se no Dynamics AX 2012 R3. Pode ou não ser válida para outras versões.

Recentemente estava a criar um formulário que precisava de mostrar um valor para cada elemento num enum. Em vez de criar manualmente os campos (e depois precisar de manter o formulário caso o enum seja modificado), decidi implementá-lo dinamicamente para que adicionasse automaticamente os campos ao design em tempo de execução.

No entanto, rapidamente descobri que iterar sobre os valores num enum, embora seja fácil quando se sabe como, é um pouco confuso.

Obviamente, precisas de começar pela aula DictEnum. Como verás, esta aula tem vários métodos para obter informações, como nome e etiqueta, tanto a partir do índice como do valor.

A diferença entre índice e valor é que o índice é o número de um elemento no enum, se os elementos do enum fossem numerados sequencialmente começando a zero, enquanto o valor é a propriedade real de "valor" do elemento. Como a maioria dos enums tem valores numerados sequencialmente a partir de 0, o índice e o valor de um elemento serão frequentemente os mesmos, mas certamente nem sempre.

Mas como saber quais os valores que um enum tem? É aqui que fica confuso. A classe DictEnum tem um método chamado values(). Poderias esperar que este método devolvesse uma lista dos valores do enum, mas isso seria obviamente demasiado fácil, por isso devolve 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, por isso é necessário usar este número como base para chamar os métodos baseados em índice, e não os baseados em valores.

Se ao menos tivessem nomeado este método indexes(), teria sido menos confuso ;-)

Também tenha em mente que os valores de enum (e aparentemente estes "índices") começam em 0, ao contrário dos índices de array e container em X++, que começam em 1, por isso, para fazer looping sobre os elementos de um enum pode fazer algo assim:

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)));
}

Isto irá enviar o símbolo e a etiqueta de cada elemento do enum para o infolog.

Leitura adicional

Se gostou deste post, também pode gostar destas sugestões:


Partilhar no BlueskyPartilhar no FacebookPartilhar no LinkedInPartilhar no TumblrPartilhar em XPartilhar no LinkedInFixar no Pinterest

Mikkel Christensen

Sobre o autor

Mikkel Christensen
Mikkel é o criador e proprietário do miklix.com. Tem mais de 20 anos de experiência como programador informático/desenvolvedor de software profissional e trabalha atualmente a tempo inteiro para uma grande empresa europeia de TI. Quando não está a escrever no blogue, dedica o seu tempo livre a um vasto leque de interesses, passatempos e actividades, que podem, em certa medida, refletir-se na variedade de tópicos abordados neste sítio Web.