Come scorrere gli elementi di un enum dal codice X++ in Dynamics AX 2012
Pubblicato: 15 febbraio 2025 alle ore 23:10:38 UTC
Questo articolo spiega come enumerare e ciclare sugli elementi di un enum di base in Dynamics AX 2012, incluso un esempio di codice X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Le informazioni contenute in questo post si basano su Dynamics AX 2012 R3. Potrebbero essere valide o meno per altre versioni.
Di recente stavo creando un form che doveva visualizzare un valore per ogni elemento in un enum. Invece di creare manualmente i campi (e poi dover gestire il form se l'enum viene modificato), ho deciso di implementarlo dinamicamente in modo che aggiungesse automaticamente i campi al design in fase di esecuzione.
Tuttavia, ho scoperto presto che l'iterazione effettiva sui valori in un enum, sebbene abbastanza semplice una volta capito come fare, può risultare un po' complicata.
Ovviamente devi iniziare con la classe DictEnum. Come vedrai, questa classe ha diversi metodi per ottenere informazioni come nome ed etichetta sia dall'indice che dal valore.
La differenza tra indice e valore è che indice è il numero di un elemento nell'enum, se gli elementi dell'enum sono stati numerati in sequenza a partire da zero, mentre valore è la proprietà "valore" effettiva dell'elemento. Poiché la maggior parte degli enum ha valori numerati in sequenza a partire da 0, indice e valore di un elemento saranno spesso gli stessi, ma certamente non sempre .
Ma come fai a sapere quali valori ha un enum? Ecco dove inizia la confusione. La classe DictEnum ha un metodo chiamato values(). Potresti aspettarti che questo metodo restituisca un elenco dei valori dell'enum, ma sarebbe ovviamente troppo facile, quindi restituisce invece il numero di valori che l'enum contiene. Tuttavia, il numero di valori non ha nulla a che fare con i valori effettivi, quindi devi usare questo numero come base per chiamare i metodi basati sull'indice, non quelli basati sul valore.
Se solo avessero chiamato questo metodo indexes(), sarebbe stato meno confusionario ;-)
Tieni presente che i valori enum (e apparentemente questi "indici") iniziano da 0, a differenza degli indici di array e contenitori in X++, che iniziano da 1, quindi per eseguire un ciclo sugli elementi in un enum potresti fare qualcosa del genere:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
In questo modo verranno visualizzati nell'infolog il simbolo e l'etichetta di ciascun elemento nell'enum.