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.
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:
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.