Jak iterować po elementach wyliczenia z kodu X++ w systemie Dynamics AX 2012
Opublikowano: 15 lutego 2025 23:10:52 UTC
Ostatnia aktualizacja: 12 stycznia 2026 08:42:03 UTC
W tym artykule wyjaśniono, jak wyliczać i wykonywać pętle na elementach 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ć aktualne dla innych wersji.
Niedawno tworzyłem formularz, który musiał wyświetlać wartość dla każdego elementu wyliczenia. Zamiast ręcznie tworzyć pola (i następnie utrzymywać formularz w przypadku modyfikacji wyliczenia), zdecydowałem się na implementację dynamiczną, aby automatycznie dodawać pola do projektu w czasie wykonywania.
Jednak wkrótce odkryłem, że iterowanie po wartościach w wyliczeniu, choć dość proste, gdy już wiesz, jak to zrobić, jest nieco mylące.
Oczywiście musisz zacząć od klasy DictEnum. Jak zobaczysz, klasa ta oferuje kilka metod pobierania informacji, takich jak nazwa i etykieta, zarówno z indeksu, jak i wartości.
Różnica między indeksem a wartością polega na tym, że indeks to numer elementu w wyliczeniu, jeśli elementy wyliczenia były numerowane sekwencyjnie, zaczynając od zera, natomiast wartość to faktyczna właściwość „wartości” elementu. Ponieważ większość wyliczeń ma wartości numerowane sekwencyjnie od 0, indeks i wartość elementu często będą takie same, ale z pewnością nie zawsze.
Ale skąd wiadomo, jakie wartości ma wyliczenie? Tu właśnie pojawia się zamieszanie. Klasa DictEnum ma metodę o nazwie values(). Można by oczekiwać, że metoda ta zwróci listę wartości wyliczenia, ale to oczywiście byłoby 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 indeksach, 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.
Dalsza lektura
Jeśli podobał Ci się ten wpis, mogą Cię zainteresować również poniższe sugestie:
- Błąd „Brak zdefiniowanej klasy metadanych dla obiektu kontraktu danych” w systemie Dynamics AX 2012
- Różnica między data() i buf2Buf() w Dynamics AX 2012
- Wywoływanie usług dokumentów AIF bezpośrednio z X++ w Dynamics AX 2012
