Miklix

Как перебрать элементы перечисления из кода X++ в Dynamics AX 2012

Опубликовано: 15 февраля 2025 г. в 23:10:56 UTC
Последнее обновление: 12 января 2026 г. в 08:42:05 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. Она может быть или не быть актуальна для других версий.

Недавно я создавал форму, в которой нужно было отображать значение для каждого элемента перечисления. Вместо того чтобы создавать поля вручную (и затем поддерживать форму при изменении перечисления), я решил реализовать это динамически, чтобы поля автоматически добавлялись в дизайн во время выполнения.

Однако вскоре я обнаружил, что итерация по значениям в перечислении, хотя и достаточно проста, если знать, как это делать, несколько запутанна.

Начать, разумеется, нужно с класса DictEnum. Как вы увидите, этот класс имеет несколько методов для получения информации, такой как имя и метка, как по индексу, так и по значению.

Разница между индексом и значением заключается в том, что индекс — это порядковый номер элемента в перечислении, если бы элементы перечисления нумеровались последовательно, начиная с нуля, а значение — это фактическое свойство «значение» элемента. Поскольку в большинстве перечислений значения нумеруются последовательно, начиная с 0, индекс и значение элемента часто будут совпадать, но, конечно, не всегда.

Но как узнать, какие значения содержит перечисление? Вот тут-то и начинается путаница. Класс DictEnum имеет метод values(). Можно было бы ожидать, что этот метод вернет список значений перечисления, но это было бы слишком просто, поэтому вместо этого он возвращает количество значений, содержащихся в перечислении. Однако количество значений никак не связано с фактическими значениями, поэтому для вызова методов, основанных на индексах, следует использовать именно это число, а не методы, основанные на значениях.

Если бы этот метод назвали indexes(), всё было бы гораздо понятнее ;-)

Также следует помнить, что значения перечислений (и, по-видимому, эти «индексы») начинаются с 0, в отличие от индексов массивов и контейнеров в X++, которые начинаются с 1, поэтому для перебора элементов перечисления можно сделать что-то подобное:

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Закрепить на Pinterest

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

Об авторе

Миккель Кристенсен
Миккель - создатель и владелец сайта miklix.com. Он имеет более чем 20-летний опыт работы в качестве профессионального программиста/разработчика программного обеспечения и в настоящее время работает на полную ставку в крупной европейской IT-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.