Как перебрать элементы перечисления из кода 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, поэтому для перебора элементов перечисления можно сделать что-то вроде этого:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Это выведет символ и метку каждого элемента перечисления в infolog.