Как перебрать элементы перечисления из кода 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, поэтому для перебора элементов перечисления можно сделать что-то подобное:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Это позволит вывести в информационный журнал символ и метку каждого элемента перечисления.
Дополнительное чтение
Если вам понравился этот пост, вам также могут понравиться эти предложения:
- Определение класса документа и запроса для службы AIF в Dynamics AX 2012
- Разница между data() и buf2Buf() в Dynamics AX 2012
- Ошибка «Не определен класс метаданных для объекта контракта данных» в Dynamics AX 2012
