Miklix

Как да итерирате елементите на Enum от X++ код в Dynamics AX 2012

Публикувано: 15 февруари 2025 г. в 23:09:56 ч. UTC
Последна актуализация: 12 януари 2026 г. в 8:41:52 ч. UTC

Тази статия обяснява как да се изброяват и обхождат елементите на базово изброяване в 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. Както ще видите, този клас има няколко метода за получаване на информация като име и етикет както от индекс, така и от стойност.

Разликата между индекс и стойност е, че индексът е номерът на елемент в изброяването, ако елементите на изброяването са номерирани последователно, започвайки от нула, докато стойността е действителното свойство „стойност“ на елемента. Тъй като повечето изброявания имат стойности, номерирани последователно от 0, индексът и стойността на елемента често ще бъдат еднакви, но със сигурност не винаги.

Но как да разберете кои стойности има едно изброяване? Тук става объркващо. Класът DictEnum има метод, наречен values(). Може да очаквате този метод да върне списък със стойностите на изброяването, но това очевидно би било твърде лесно, така че вместо това той връща броя на стойностите, които изброяването съдържа. Броят на стойностите обаче няма нищо общо с действителните стойности, така че трябва да използвате това число като основа за извикване на методите, базирани на индекси, а не на тези, базирани на стойности.

Ако само бяха кръстили този метод indexes(), щеше да е по-малко объркващо ;-)

Също така имайте предвид, че стойностите на enum (и очевидно тези "индекси") започват от 0, за разлика от индексите на масиви и контейнери в X++, които започват от 1, така че за да обходите елементите в enum, можете да направите нещо подобно:

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)));
}

Това ще изведе символа и етикета на всеки елемент от изброяването в инфолога.

Допълнително четене

Ако ви е харесала тази публикация, може да ви харесат и тези предложения:


Споделете в BlueskyСподелете във FacebookСподелете в LinkedInСподелете в TumblrСподелете в XСподелете в LinkedInЗакачи в Пинтерест

Микел Кристенсен

За автора

Микел Кристенсен
Микел е създател и собственик на сайта miklix.com. Той има над 20 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.