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