Jak iterować po elementach wyliczenia z kodu X++ w systemie Dynamics AX 2012
Opublikowano: 15 lutego 2025 23:10:52 UTC
W tym artykule wyjaśniono, jak wyliczać i pętliwać elementy wyliczenia bazowego w systemie Dynamics AX 2012, w tym przykład kodu X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informacje zawarte w tym poście dotyczą systemu Dynamics AX 2012 R3. Mogą być lub nie być ważne dla innych wersji.
Ostatnio tworzyłem formularz, który musiał wyświetlać wartość dla każdego elementu w wyliczeniu. Zamiast ręcznie tworzyć pola (i następnie utrzymywać formularz, jeśli wyliczenie zostanie kiedykolwiek zmodyfikowane), postanowiłem wdrożyć go dynamicznie, aby automatycznie dodawał pola do projektu w czasie wykonywania.
Jednak szybko odkryłem, że iterowanie po wartościach w wyliczeniach, choć dość proste, gdy już się wie, jak to zrobić, jest nieco mylące.
Oczywiście musisz zacząć od klasy DictEnum. Jak zobaczysz, ta klasa ma kilka metod uzyskiwania informacji, takich jak nazwa i etykieta, zarówno z indeksu, jak i wartości.
Różnica między index i value polega na tym, że index jest numerem elementu w wyliczeniu, jeśli elementy wyliczenia były numerowane sekwencyjnie zaczynając od zera, podczas gdy value jest rzeczywistą właściwością „value” elementu. Ponieważ większość wyliczeń ma wartości numerowane sekwencyjnie od 0, index i value elementu często będą takie same, ale z pewnością nie zawsze .
Ale skąd wiesz, jakie wartości ma wyliczenie? Tutaj zaczyna się robić niejasno. Klasa DictEnum ma metodę o nazwie values(). Można by się spodziewać, że ta metoda zwróci listę wartości wyliczenia, ale byłoby to oczywiście zbyt proste, więc zamiast tego zwraca liczbę wartości zawartych w wyliczeniu. Jednak liczba wartości nie ma nic wspólnego z rzeczywistymi wartościami, więc należy użyć tej liczby jako podstawy do wywołania metod opartych na indeksie, a nie wartościach.
Gdyby tylko nazwali tę metodę indexes(), byłoby to mniej mylące ;-)
Należy również pamiętać, że wartości wyliczeniowe (i najwyraźniej te „indeksy”) zaczynają się od 0, w przeciwieństwie do indeksów tablic i kontenerów w X++, które zaczynają się od 1. Dlatego, aby przejść przez elementy wyliczenia, można napisać coś takiego:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Spowoduje to wyświetlenie symbolu i etykiety każdego elementu wyliczenia w infologu.