Hur man itererar över elementen i en enum från X++-kod i Dynamics AX 2012
Publicerad: 15 februari 2025 kl. 23:10:59 UTC
Den här artikeln förklarar hur man räknar upp och går över elementen i en basuppräkning i Dynamics AX 2012, inklusive ett X++-kodexempel.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informationen i det här inlägget är baserad på Dynamics AX 2012 R3. Det kan eller kanske inte är giltigt för andra versioner.
Jag skapade nyligen ett formulär som behövde visa ett värde för varje element i en enum. Istället för att manuellt skapa fälten (och sedan behöva underhålla formuläret om enumet någonsin ändras), bestämde jag mig för att implementera det dynamiskt så att det automatiskt skulle lägga till fälten i designen under körning.
Men jag upptäckte snart att det är lite förvirrande att faktiskt iterera över värdena i en uppräkning, även om det är lätt nog när du vet hur.
Du måste självklart börja med DictEnum-klassen. Som du kommer att se har den här klassen flera metoder för att få information som namn och etikett från både index och värde.
Skillnaden mellan index och värde är att index är ett elements nummer i enumet, om enumets element numrerades sekventiellt med början från noll, medan value är elementets faktiska "värde"-egenskap. Eftersom de flesta uppräkningar har värden numrerade sekventiellt från 0, kommer index och värde för ett element ofta att vara desamma, men absolut inte alltid .
Men hur vet man vilka värden en enum har? Det är här det blir förvirrande. Klassen DictEnum har en metod som heter values(). Du kanske förväntar dig att den här metoden returnerar en lista över enumens värden, men det skulle uppenbarligen vara för lätt, så istället returnerar den antalet värden som enumet innehåller. Antalet värden har dock ingenting att göra med de faktiska värdena, så du måste använda detta nummer som grund för att anropa de indexbaserade metoderna, inte de värdebaserade.
Om de bara hade döpt den här metoden till indexes() istället, hade det varit mindre förvirrande ;-)
Tänk också på att enumvärden (och tydligen dessa "index") börjar på 0, till skillnad från array- och containerindex i X++, som börjar på 1, så för att gå över elementen i en enum kan du göra något så här:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Detta kommer att mata ut symbolen och etiketten för varje element i enumen till infologgen.