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

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.


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

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 enumen till infologgen.

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

Mikkel Bang Christensen

Om författaren

Mikkel Bang 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.