Як виконувати ітерацію елементів переліку з коду X++ у Dynamics AX 2012
Опубліковано: 15 лютого 2025 р. о 23:11:01 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. Як ви побачите, цей клас має кілька методів отримання інформації, такої як ім'я та мітка як з індексу, так і зі значення.
Різниця між індексом і значенням полягає в тому, що індекс є номером елемента в переліку, якщо елементи переліку були пронумеровані послідовно, починаючи з нуля, тоді як value є фактичною властивістю елемента "value". Оскільки більшість переліків мають значення, пронумеровані послідовно від 0, індекс і значення елемента часто будуть однаковими, але, звичайно, не завжди.
Але як дізнатися, які значення має перелік? Ось тут і виникає плутанина. Клас DictEnum має метод під назвою values(). Ви можете очікувати, що цей метод поверне список значень переліку, але це, очевидно, буде занадто просто, тому замість цього він повертає кількість значень , які містить перелік. Однак кількість значень не має нічого спільного з фактичними значеннями, тому вам потрібно використовувати це число як основу для виклику методів, заснованих на індексі, а не на основі значень.
Якби вони замість цього назвали цей метод indexs(), це було б менш заплутано ;-)
Також майте на увазі, що значення переліків (і, очевидно, ці "індекси") починаються з 0, на відміну від індексів масивів і контейнерів у X++, які починаються з 1, тому, щоб перебрати елементи в переліку, ви можете зробити щось на кшталт цього:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Це виведе символ і мітку кожного елемента в перелік до інформаційного журналу.