Miklix

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
Senast uppdaterad: 12 januari 2026 kl. 08:42:07 UTC

Den här artikeln förklarar hur man räknar upp och loopar över elementen i en basuppräkning i Dynamics AX 2012, inklusive ett X++-kodexempel.


Denna sida har maskinöversatts från engelska för att göra den tillgänglig för så många som möjligt. Tyvärr är maskinöversättning ännu inte en fulländad teknik, så fel kan uppstå. Om du föredrar det kan du se den engelska originalversionen här:

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. Den kan vara giltig för andra versioner, men inte nödvändigtvis.

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 enumen 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 vid körning.

Jag upptäckte dock snart att det faktiskt är lite förvirrande att iterera över värdena i en enum, även om det är enkelt nog när man väl vet hur.

Du behöver självklart börja med DictEnum-klassen. Som du kommer att se har den här klassen flera metoder för att hämta information som namn och etikett från både index och värde.

Skillnaden mellan index och value är att index är ett elements nummer i enum, om enumens element numrerades sekventiellt med början från noll, medan value är elementets faktiska "värde"-egenskap. Eftersom de flesta enum har värden numrerade sekventiellt från 0, kommer index och värde för ett element ofta att vara detsamma, men absolut inte alltid.

Men hur vet man vilka värden en enum har? Det är här det blir förvirrande. DictEnum-klassen har en metod som heter values(). Man kanske förväntar sig att den här metoden returnerar en lista över enumens värden, men det skulle uppenbarligen vara för enkelt, så istället returnerar den antalet värden som enumen innehåller. Antalet värden har dock ingenting att göra med de faktiska värdena, så man måste använda detta tal 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 enum-vä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 loopa över elementen i en enum kan du göra något liknande:

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

Detta kommer att mata ut symbolen och etiketten för varje element i enum till infologgen.

Vidare läsning

Om du gillade det här inlägget kanske du också gillar dessa förslag:


Dela på BlueskyDela på FacebookDela på LinkedInDela på TumblrDela på XDela på LinkedInFäst på Pinterest

Mikkel Christensen

Om författaren

Mikkel Christensen
Mikkel är skaparen och ägaren av miklix.com. Han har över 20 års erfarenhet som professionell datorprogrammerare/mjukvaruutvecklare och är för närvarande heltidsanställd på ett stort europeiskt IT-bolag. När han inte bloggar ägnar han sin fritid åt en mängd olika intressen, hobbies och aktiviteter, vilket i viss mån kan återspeglas i de olika ämnen som behandlas på den här webbplatsen.