Miklix

Sådan itereres over elementerne i en enum fra X++-kode i Dynamics AX 2012

Udgivet: 15. februar 2025 kl. 23.10.01 UTC
Sidst opdateret: 12. januar 2026 kl. 08.41.53 UTC

Denne artikel forklarer, hvordan man opregner og gentager elementerne i en basisoptælling i Dynamics AX 2012, inklusive et X++-kodeeksempel.


Denne side er blevet maskinoversat fra engelsk for at gøre den tilgængelig for så mange mennesker som muligt. Desværre er maskinoversættelse endnu ikke en perfekt teknologi, så der kan forekomme fejl. Hvis du foretrækker det, kan du se den originale engelske version her:

How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012

Oplysningerne i dette indlæg er baseret på Dynamics AX 2012 R3. De er muligvis ikke gyldige for andre versioner.

Jeg var for nylig i gang med at oprette en formular, der skulle vise en værdi for hvert element i en enum. I stedet for manuelt at oprette felterne (og derefter skulle vedligeholde formularen, hvis enum'en nogensinde ændres), besluttede jeg at implementere den dynamisk, så den automatisk ville tilføje felterne til designet under kørsel.

Jeg opdagede dog hurtigt, at det faktisk er lidt forvirrende at iterere over værdierne i en enum, selvom det er nemt nok, når man først ved hvordan.

Du skal naturligvis starte med DictEnum-klassen. Som du vil se, har denne klasse flere metoder til at indhente information såsom navn og label fra både indeks og værdi.

Forskellen mellem indeks og værdi er, at indeks er et elements nummer i enum'en, hvis enum'ens elementer er nummereret sekventielt startende fra nul, mens værdi er elementets faktiske "værdi"-egenskab. Da de fleste enum'er har værdier nummereret sekventielt fra 0, vil indekset og værdien af et element ofte være den samme, men bestemt ikke altid.

Men hvordan ved man, hvilke værdier en enum har? Det er her, det bliver forvirrende. DictEnum-klassen har en metode kaldet values(). Man kunne forvente, at denne metode returnerer en liste over enumens værdier, men det ville naturligvis være for nemt, så i stedet returnerer den antallet af værdier, som enumen indeholder. Antallet af værdier har dog intet at gøre med de faktiske værdier, så man skal bruge dette tal som grundlag for at kalde de indeksbaserede metoder, ikke de værdibaserede.

Hvis de bare havde navngivet denne metode indexes() i stedet, ville det have været mindre forvirrende ;-)

Husk også, at enum-værdier (og tilsyneladende disse "indekser") starter ved 0, i modsætning til array- og containerindekser i X++, som starter ved 1, så for at loope over elementerne i en enum kan du gøre noget i retning af dette:

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 udsende symbolet og etiketten for hvert element i enum'en til infologgen.

Yderligere læsning

Hvis du kunne lide dette indlæg, kan du måske også lide disse forslag:


Del på BlueskyDel på FacebookDel på LinkedInDel på TumblrDel på XDel på LinkedInFastgør på Pinterest

Mikkel Christensen

Om forfatteren

Mikkel Christensen
Mikkel er skaberen og ejeren af miklix.com. Han har over 20 års erfaring som professionel computerprogrammør/softwareudvikler og er i øjeblikket fuldtidsansat i en stor europæisk IT-virksomhed. Når han ikke blogger, bruger han sin fritid på en lang række interesser, hobbyer og aktiviteter, som i et vist omfang afspejles i de mange forskellige emner, der dækkes på dette websted.