Как да итерирате елементите на Enum от X++ код в Dynamics AX 2012
Публикувано: 15 февруари 2025 г. в 23:09:56 ч. UTC
Тази статия обяснява как да изброявате и преминавате през елементите на базово enum в Dynamics AX 2012, включително пример за X++ код.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Информацията в тази публикация е базирана на Dynamics AX 2012 R3. Може или не може да е валидно за други версии.
Наскоро създавах формуляр, който трябваше да покаже стойност за всеки елемент в enum. Вместо ръчно да създавам полетата (и след това да се налага да поддържам формуляра, ако enum бъде модифициран), реших да го внедря динамично, така че автоматично да добавя полетата към дизайна по време на изпълнение.
Скоро обаче открих, че действителното итериране на стойностите в enum, макар и достатъчно лесно, след като знаете как, е малко объркващо.
Очевидно трябва да започнете с класа DictEnum. Както ще видите, този клас има няколко метода за получаване на информация като име и етикет от индекс и стойност.
Разликата между индекс и стойност е, че индексът е номерът на елемент в enum, ако елементите на enum са номерирани последователно, започвайки от нула, докато value е действителното свойство "стойност" на елемента. Тъй като повечето преброявания имат стойности, номерирани последователно от 0, индексът и стойността на елемент често ще бъдат еднакви, но със сигурност не винаги .
Но как да разберете кои стойности има enum? Тук става объркващо. Класът DictEnum има метод, наречен values(). Може да очаквате този метод да върне списък със стойностите на enum, но това очевидно би било твърде лесно, така че вместо това той връща броя на стойностите, които съдържа enum. Броят на стойностите обаче няма нищо общо с действителните стойности, така че трябва да използвате това число като основа за извикване на методите, базирани на индекс, а не на тези, базирани на стойност.
Само ако бяха нарекли този метод indexes() вместо това, щеше да е по-малко объркващо ;-)
Също така имайте предвид, че стойностите на enum (и очевидно тези „индекси“) започват от 0, за разлика от индексите на масиви и контейнери в X++, които започват от 1, така че за да преминете през елементите в enum, можете да направите нещо подобно:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Това ще изведе символа и етикета на всеки елемент в enum в информационния журнал.