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.
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:
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:
- Konverter en ægte til streng med alle decimaler i Dynamics AX 2012
- Strengformatering med makro og strFmt i Dynamics AX 2012
- Forskellen mellem data() og buf2Buf() i Dynamics AX 2012
