Како да се повторуваат над елементите на Enum од кодот X++ во Dynamics AX 2012
Објавено: 5 март 2025, во 19:54:48 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, индексот и вредноста на елементот честопати ќе бидат исти, но секако не секогаш .
Но, како да знаете кои вредности има enum? Ова е местото каде што станува збунувачки. Класата DictEnum има метод наречен values(). Можеби очекувате овој метод да врати список со вредностите на enum, но тоа очигледно би било премногу лесно, па наместо тоа го враќа бројот на вредности што ги содржи enum. Сепак, бројот на вредности нема никаква врска со вистинските вредности, така што треба да го користите овој број како основа за повикување на методите базирани на индекси, а не на оние базирани на вредности.
Само ако го наречеа овој метод индекси() наместо тоа, ќе беше помалку збунувачки ;-)
Исто така, имајте на ум дека нумеричките вредности (и очигледно овие „индекси“) започнуваат на 0, за разлика од индексите на низи и контејнери во X++, кои започнуваат на 1, така што за да ги превртите елементите во нумерите, можете да направите нешто вака:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Ова ќе ги изнесе симболот и етикетата на секој елемент во нумерата во инфологот.