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

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++.


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

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:

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 produzirá o símbolo e o rótulo de cada elemento na enumeração para o infolog.

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

Mikkel Bang Christensen

Sobre o autor

Mikkel Bang 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.