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

Denne artikel forklarer, hvordan man opregner og looper over elementerne i en basisenum i Dynamics AX 2012, herunder 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. Det er muligvis ikke gyldigt for andre versioner.

Jeg lavede for nylig 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 enummet nogensinde bliver ændret), besluttede jeg at implementere det dynamisk, så det automatisk ville tilføje felterne til designet under kørsel.

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

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

Forskellen mellem indeks og værdi er, at indeks er et elements nummer i enum, hvis enumets elementer blev nummereret sekventielt startende fra nul, mens værdi er elementets faktiske "værdi" egenskab. Da de fleste enums har værdier nummereret sekventielt fra 0, vil indekset og værdien af ​​et element ofte være det 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 værdier(). Du kan forvente, at denne metode returnerer en liste over enum-værdierne, men det ville naturligvis være for nemt, så i stedet returnerer den antallet af værdier, som enumet indeholder. Antallet af værdier har dog intet at gøre med de faktiske værdier, så du skal bruge dette tal som grundlag for at kalde de indeksbaserede metoder, ikke de værdibaserede.

Hvis bare de 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 gå over elementerne i en enum kan du gøre noget som 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 udskrive symbolet og etiketten for hvert element i enummet til infologgen.

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

Mikkel Bang Christensen

Om forfatteren

Mikkel Bang 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.