Come scorrere gli elementi di un enum dal codice X++ in Dynamics AX 2012
Pubblicato: 15 febbraio 2025 alle ore 23:10:38 UTC
Ultimo aggiornamento: 12 gennaio 2026 alle ore 08:41:58 UTC
Questo articolo spiega come enumerare e ripetere gli 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 anche per altre versioni.
Di recente stavo creando un modulo che doveva visualizzare un valore per ogni elemento di un enum. Invece di creare manualmente i campi (e poi dover gestire il modulo in caso di modifica dell'enum), ho deciso di implementarlo dinamicamente, in modo che aggiungesse automaticamente i campi al progetto in fase di esecuzione.
Tuttavia, ho scoperto presto che l'iterazione sui valori in un enum, sebbene abbastanza semplice una volta capito come fare, può risultare un po' complicata.
Ovviamente, è necessario iniziare con la classe DictEnum. Come vedrai, questa classe dispone di 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 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 si fa a sapere quali valori ha un enum? È qui che la situazione si complica. La classe DictEnum ha un metodo chiamato values(). Ci si potrebbe aspettare che questo metodo restituisca un elenco dei valori dell'enum, ma sarebbe ovviamente troppo semplice, quindi restituisce il numero di valori contenuti nell'enum. Tuttavia, il numero di valori non ha nulla a che fare con i valori effettivi, quindi è necessario utilizzare questo numero come base per chiamare i metodi basati sugli indici, non quelli basati sui valori.
Se solo avessero chiamato questo metodo indexes(), sarebbe stato meno confusionario ;-)
Tieni presente anche 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.
Ulteriori letture
Se ti è piaciuto questo post, potrebbero piacerti anche questi suggerimenti:
- La differenza tra data() e buf2Buf() in Dynamics AX 2012
- Eliminare un'entità legale (account aziendali) in Dynamics AX 2012
- Errore "Nessuna classe di metadati definita per l'oggetto contratto dati" in Dynamics AX 2012
