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++.
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:
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:
- Erro "Nenhuma classe de metadados definida para o objeto de contrato de dados" no Dynamics AX 2012
- Identificação da classe de documento e da consulta para o serviço AIF no Dynamics AX 2012
- A diferença entre data() e buf2Buf() no Dynamics AX 2012
