Hvordan iterere over elementene til en Enum fra X++-kode i Dynamics AX 2012
Publisert: 15. februar 2025 kl. 23:10:44 UTC
Sist oppdatert: 13. september 2025 kl. 22:52:55 UTC
Denne artikkelen forklarer hvordan du lister opp og sløyfer over elementene i en grunnleggende opplisting i Dynamics AX 2012, inkludert et X++-kodeeksempel.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informasjonen i dette innlegget er basert på Dynamics AX 2012 R3. Det kan være gyldig for andre versjoner.
Jeg opprettet nylig et skjema som måtte vise en verdi for hvert element i en enum. I stedet for å opprette feltene manuelt (og deretter måtte vedlikeholde skjemaet hvis opplistingen noen gang blir endret), bestemte jeg meg for å implementere det dynamisk slik at det automatisk ville legge til feltene i utformingen under kjøring.
Imidlertid oppdaget jeg snart at det å faktisk iterere over verdiene i en enum, selv om det er enkelt nok når du vet hvordan, er litt forvirrende.
Du må åpenbart starte med DictEnum-klassen. Som du vil se, har denne klassen flere metoder for å innhente informasjon som navn og etikett fra både indeks og verdi.
Forskjellen mellom indeks og verdi er at indeks er et elements tall i enum, hvis enums elementer ble nummerert sekvensielt fra null, mens verdi er elementets faktiske "verdi"-egenskap. Siden de fleste enums har verdier nummerert sekvensielt fra 0, vil indeksen og verdien til et element ofte være den samme, men absolutt ikke alltid.
Men hvordan vet du hvilke verdier en enum har? Det er her det blir forvirrende. DictEnum-klassen har en metode kalt values(). Du kan forvente at denne metoden returnerer en liste over opplistingens verdier, men det ville åpenbart være for enkelt, så i stedet returnerer den antall verdier opplistingen inneholder. Antall verdier har imidlertid ingenting med de faktiske verdiene å gjøre, så du må bruke dette tallet som grunnlag for å kalle de indeksbaserte metodene, ikke de verdibaserte.
Hvis de bare hadde kalt denne metoden indexes() i stedet, ville det vært mindre forvirrende ;-)
Husk også at enum-verdier (og tilsynelatende disse "indeksene") starter på 0, i motsetning til matrise- og beholderindekser i X++, som starter på 1, så for å sløyfe over elementene i en enum kan du gjøre noe slikt:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Dette vil sende ut symbolet og etiketten til hvert element i oppregningen til infologgen.
Videre lesing
Hvis du likte dette innlegget, kan du også like disse forslagene:
- Dynamics AX 2012 SysOperation Framework Rask oversikt
- Identifisere dokumentklasse og spørring for AIF-tjeneste i Dynamics AX 2012
- Forskjellen mellom data() og buf2Buf() i Dynamics AX 2012