Miklix

Hoe u over de elementen van een enum kunt itereren vanuit X++-code in Dynamics AX 2012

Gepubliceerd: 15 februari 2025 om 23:10:47 UTC

In dit artikel wordt uitgelegd hoe u de elementen van een basis-enum in Dynamics AX 2012 kunt opsommen en er een lus doorheen kunt maken, inclusief een X++-codevoorbeeld.


Deze pagina is machinaal uit het Engels vertaald om hem voor zoveel mogelijk mensen toegankelijk te maken. Helaas is machinevertaling nog geen geperfectioneerde technologie, dus er kunnen fouten optreden. Als je dat liever hebt, kun je hier de originele Engelse versie bekijken:

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

De informatie in dit bericht is gebaseerd op Dynamics AX 2012 R3. Het kan wel of niet geldig zijn voor andere versies.

Ik was onlangs bezig met het maken van een formulier dat een waarde moest weergeven voor elk element in een enum. In plaats van de velden handmatig te maken (en het formulier vervolgens te moeten onderhouden als de enum ooit wordt gewijzigd), besloot ik het dynamisch te implementeren, zodat het automatisch de velden aan het ontwerp zou toevoegen tijdens runtime.

Ik ontdekte echter al snel dat het daadwerkelijk doorlopen van de waarden in een enum weliswaar eenvoudig is als je eenmaal weet hoe, maar dat het toch wat verwarrend kan zijn.

U moet uiteraard beginnen met de DictEnum-klasse. Zoals u zult zien, heeft deze klasse verschillende methoden om informatie te verkrijgen, zoals naam en label van zowel index als waarde.

Het verschil tussen index en waarde is dat index het nummer van een element in de enum is, als de elementen van de enum opeenvolgend genummerd zijn vanaf nul, terwijl waarde de werkelijke "waarde"-eigenschap van het element is. Aangezien de meeste enums waarden hebben die opeenvolgend genummerd zijn vanaf 0, zullen de index en waarde van een element vaak hetzelfde zijn, maar zeker niet altijd .

Maar hoe weet je welke waarden een enum heeft? Dit is waar het verwarrend wordt. De DictEnum-klasse heeft een methode genaamd values(). Je zou verwachten dat deze methode een lijst met de waarden van de enum retourneert, maar dat zou natuurlijk te makkelijk zijn, dus retourneert het in plaats daarvan het aantal waarden dat de enum bevat. Het aantal waarden heeft echter niets te maken met de werkelijke waarden, dus je moet dit aantal gebruiken als basis voor het aanroepen van de op indexen gebaseerde methoden, niet de op waarden gebaseerde.

Als ze deze methode nou eens indexes() hadden genoemd, was het minder verwarrend geweest ;-)

Houd er ook rekening mee dat enum-waarden (en blijkbaar deze "indexen") bij 0 beginnen, in tegenstelling tot array- en containerindexen in X++, die bij 1 beginnen. Om dus over de elementen in een enum te loopen, kunt u zoiets doen:

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

Hiermee worden het symbool en het label van elk element in de enum naar het infolog gestuurd.

Delen op BlueskyDelen op FacebookDelen op LinkedInDelen op TumblrDelen op XDelen op LinkedInPin op Pinterest

Mikkel Bang Christensen

Over de auteur

Mikkel Bang Christensen
Mikkel is de bedenker en eigenaar van miklix.com. Hij heeft meer dan 20 jaar ervaring als professioneel computerprogrammeur/softwareontwikkelaar en werkt momenteel fulltime voor een groot Europees IT-bedrijf. Als hij niet blogt, besteedt hij zijn vrije tijd aan een breed scala aan interesses, hobby's en activiteiten, die tot op zekere hoogte weerspiegeld kunnen worden in de verscheidenheid aan onderwerpen op deze website.