Як виконувати ітерацію елементів переліку з коду 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, тому для перебору елементів у переліку ви можете зробити щось на кшталт:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Це виведе символ та мітку кожного елемента переліку до інфологу.
Додаткова література
Якщо вам сподобався цей пост, вам також можуть сподобатися ці пропозиції:
- Визначення класу документа та запиту для служби AIF у Dynamics AX 2012
- Використання запиту в класі контрактів даних SysOperation в Dynamics AX 2012
- Виклик служб документообігу AIF безпосередньо з X++ у Dynamics AX 2012
