Miklix

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.


Denne siden er maskinoversatt fra engelsk for å gjøre den tilgjengelig for så mange som mulig. Dessverre er maskinoversettelse ennå ikke en fullkommen teknologi, så det kan forekomme feil. Hvis du foretrekker det, kan du se den engelske originalversjonen her:

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:

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)));
}

Dette vil sende ut symbolet og etiketten for hvert element i enum til infologgen.

Del på BlueskyDel på FacebookDel på LinkedInDel på TumblrDel på XDel på LinkedInFest på Pinterest

Mikkel Bang Christensen

Om forfatteren

Mikkel Bang Christensen
Mikkel er skaperen og eieren av miklix.com. Han har over 20 års erfaring som profesjonell dataprogrammerer/programvareutvikler og er for tiden ansatt på fulltid i et stort europeisk IT-selskap. Når han ikke blogger, bruker han fritiden sin på en lang rekke interesser, hobbyer og aktiviteter, noe som til en viss grad kan gjenspeiles i de mange ulike temaene som dekkes på dette nettstedet.