Miklix

Як виконувати ітерацію елементів переліку з коду X++ у Dynamics AX 2012

Опубліковано: 15 лютого 2025 р. о 23:11:01 UTC
Останнє оновлення: 12 січня 2026 р. о 08:42:08 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)));
}

Це виведе символ та мітку кожного елемента переліку до інфологу.

Додаткова література

Якщо вам сподобався цей пост, вам також можуть сподобатися ці пропозиції:


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

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

Про автора

Міккель Крістенсен
Міккель - творець і власник сайту miklix.com. Він має понад 20 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.