Cum să repeți asupra elementelor unei enumerari din codul X++ în Dynamics AX 2012
Publicat: 15 februarie 2025 la 23:10:55 UTC
Acest articol explică cum să enumerați și să treceți în buclă peste elementele unei enumerari de bază în Dynamics AX 2012, inclusiv un exemplu de cod X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informațiile din această postare se bazează pe Dynamics AX 2012 R3. Poate fi valabil sau nu pentru alte versiuni.
Am creat recent un formular care trebuia să afișeze o valoare pentru fiecare element dintr-o enumerare. În loc să creez manual câmpurile (și apoi să trebuiască să mențin formularul dacă enumerarea este vreodată modificată), am decis să o implementez dinamic, astfel încât să adauge automat câmpurile la proiect în timpul execuției.
Cu toate acestea, am descoperit curând că repetarea valorilor dintr-o enumerare, deși destul de ușoară odată ce știi cum, este puțin confuză.
Evident, trebuie să începeți cu clasa DictEnum. După cum veți vedea, această clasă are mai multe metode pentru obținerea de informații, cum ar fi numele și eticheta, atât din index, cât și din valoare.
Diferența dintre index și valoare este că index este numărul unui element din enumerare, dacă elementele enumerației au fost numerotate secvenţial începând de la zero, în timp ce valoarea este proprietatea "valoare" reală a elementului. Deoarece majoritatea enumărilor au valori numerotate succesiv de la 0, indexul și valoarea unui element vor fi adesea aceleași, dar cu siguranță nu întotdeauna .
Dar de unde știi ce valori are o enumerare? Aici devine confuz. Clasa DictEnum are o metodă numită values(). S-ar putea să vă așteptați ca această metodă să returneze o listă cu valorile enumerației, dar asta ar fi evident prea ușor, așa că în schimb returnează numărul de valori pe care le conține enumerarea. Cu toate acestea, numărul de valori nu are nimic de-a face cu valorile reale, așa că trebuie să utilizați acest număr ca bază pentru apelarea metodelor bazate pe index, nu pe cele bazate pe valori.
Dacă ar fi numit această metodă indexes(), ar fi fost mai puțin confuz ;-)
De asemenea, țineți cont de faptul că valorile enumerare (și se pare că acești „indexuri”) încep de la 0, spre deosebire de indicii de matrice și container din X++, care încep de la 1, așa că pentru a trece peste elementele dintr-o enumerare ați putea face ceva de genul acesta:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Aceasta va scoate simbolul și eticheta fiecărui element din enumerare în infolog.