Miklix

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

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

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

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

Очевидно, вам нужно начать с класса 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)));
}

Это выведет символ и метку каждого элемента перечисления в infolog.

Поделиться на BlueskyПоделиться на FacebookПоделиться на LinkedInПоделиться на TumblrПоделиться на XПоделиться на LinkedInЗакрепить на Pinterest

Миккель Банг Кристенсен

Об авторе

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