Hvordan iterere over elementene til en Enum fra X++-kode i Dynamics AX 2012
Publisert: 15. februar 2025 kl. 23:10:44 UTC
Denne artikkelen forklarer hvordan du teller opp og går over elementene i en grunnopptelling i Dynamics AX 2012, inkludert et X++-kodeeksempel.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informasjonen i dette innlegget er basert på Dynamics AX 2012 R3. Det kan være eller ikke være gyldig for andre versjoner.
Jeg opprettet nylig et skjema som måtte vise en verdi for hvert element i en enum. I stedet for å lage feltene manuelt (og deretter trenge å vedlikeholde skjemaet hvis enumet noen gang blir endret), bestemte jeg meg for å implementere det dynamisk slik at det automatisk ville legge til feltene i designet under kjøring.
Imidlertid oppdaget jeg snart at det faktisk er litt forvirrende å iterere over verdiene i en enum, selv om det er enkelt nok når du vet hvordan.
Du må åpenbart begynne med DictEnum-klassen. Som du vil se, har denne klassen flere metoder for å få informasjon som navn og etikett fra både indeks og verdi.
Forskjellen mellom indeks og verdi er at indeks er et elements tall i enum, hvis enumets elementer ble nummerert sekvensielt fra null, mens verdi er elementets faktiske "verdi"-egenskap. Siden de fleste enums har verdier nummerert sekvensielt fra 0, vil indeksen og verdien til et element ofte være det samme, men absolutt ikke alltid .
Men hvordan vet du hvilke verdier en enum har? Det er her det blir forvirrende. DictEnum-klassen har en metode kalt verdier(). Du kan forvente at denne metoden returnerer en liste over enumens verdier, men det ville åpenbart være for enkelt, så i stedet returnerer den antall verdier enumet inneholder. Antall verdier har imidlertid ingenting med de faktiske verdiene å gjøre, så du må bruke dette tallet som grunnlag for å kalle de indeksbaserte metodene, ikke de verdibaserte.
Hvis de bare hadde kalt denne metoden indexes() i stedet, ville det vært mindre forvirrende ;-)
Husk også at enum-verdier (og tilsynelatende disse "indeksene") starter på 0, i motsetning til array- og containerindekser i X++, som starter på 1, så for å gå over elementene i en enum kan du gjøre noe slikt:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Dette vil sende ut symbolet og etiketten for hvert element i enum til infologgen.