Ako iterovať cez prvky Enum z kódu X++ v Dynamics AX 2012
Publikované: 15. februára 2025 o 23:10:57 UTC
Tento článok vysvetľuje, ako enumerovať a opakovať prvky základného enumu v Dynamics AX 2012, vrátane príkladu kódu X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informácie v tomto príspevku sú založené na Dynamics AX 2012 R3. Môže a nemusí platiť pre iné verzie.
Nedávno som vytváral formulár, ktorý potreboval zobraziť hodnotu pre každý prvok v zozname. Namiesto manuálneho vytvárania polí (a následnej potreby udržiavať formulár, ak sa enum niekedy zmení), som sa rozhodol implementovať ho dynamicky, aby automaticky pridal polia do návrhu za behu.
Čoskoro som však zistil, že v skutočnosti iterovanie hodnôt v enume, hoci je dosť jednoduché, keď viete ako, je trochu mätúce.
Je zrejmé, že musíte začať s triedou DictEnum. Ako uvidíte, táto trieda má niekoľko metód na získanie informácií, ako je názov a štítok z indexu aj hodnoty.
Rozdiel medzi indexom a hodnotou je v tom, že index je číslo prvku vo výčte, ak prvky výčtu boli číslované postupne od nuly, zatiaľ čo hodnota je skutočná "hodnota" vlastnosť prvku. Keďže väčšina enumov má hodnoty číslované postupne od 0, index a hodnota prvku budú často rovnaké, ale určite nie vždy .
Ale ako viete, aké hodnoty má enum? Tu to začína byť mätúce. Trieda DictEnum má metódu nazvanú values(). Môžete očakávať, že táto metóda vráti zoznam hodnôt enum, ale to by bolo zjavne príliš jednoduché, takže namiesto toho vráti počet hodnôt, ktoré enum obsahuje. Počet hodnôt však nemá nič spoločné so skutočnými hodnotami, takže toto číslo musíte použiť ako základ pre volanie metód založených na indexe, nie metód založených na hodnote.
Keby len túto metódu pomenovali indexes(), bolo by to menej mätúce ;-)
Majte tiež na pamäti, že hodnoty enum (a zrejme tieto "indexy") začínajú na 0, na rozdiel od indexov polí a kontajnerov v X++, ktoré začínajú na 1, takže na zacyklenie prvkov vo enume môžete urobiť niečo takéto:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Tým sa do infologu vypíše symbol a štítok každého prvku v zozname.