Az enum elemeinek iterálása az X++ kódból a Dynamics AX 2012-ben
Megjelent: 2025. február 15. 23:10:36 UTC
Utolsó frissítés: 2026. január 12. 8:41:57 UTC
Ez a cikk bemutatja, hogyan lehet felsorolni és végigfuttatni egy alap enumeráció elemeit a Dynamics AX 2012 rendszerben, beleértve egy X++ kódpéldát is.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
A bejegyzésben található információk a Dynamics AX 2012 R3 verzión alapulnak. Előfordulhat, hogy más verziókra nem érvényesek.
Nemrég készítettem egy űrlapot, amelynek minden enumerált elemhez meg kellett jelenítenie egy értéket. Ahelyett, hogy manuálisan hoznám létre a mezőket (és utána karban kellene tartanom az űrlapot, ha az enumerált valaha is módosul), úgy döntöttem, hogy dinamikusan implementálom, így futásidőben automatikusan hozzáadja a mezőket a tervhez.
Azonban hamarosan rájöttem, hogy az enum értékein való végigiterálás, bár elég egyszerű, ha egyszer tudjuk, hogyan kell, kissé zavaró.
Nyilvánvalóan a DictEnum osztállyal kell kezdened. Amint látni fogod, ennek az osztálynak számos metódusa van információk, például név és címke kinyerésére mind az indexből, mind az értékből.
Az index és az érték közötti különbség az, hogy az index egy elem száma az enumban, ha az enum elemei nullától kezdődően szekvenciálisan vannak számozva, míg az érték az elem tényleges „érték” tulajdonsága. Mivel a legtöbb enum értékei 0-tól kezdődően szekvenciálisan vannak számozva, egy elem indexe és értéke gyakran megegyezik, de természetesen nem mindig.
De honnan tudhatod, hogy egy enum mely értékeket tartalmazza? Itt kezd bonyolulttá válni a dolog. A DictEnum osztálynak van egy values() nevű metódusa. Azt várhatnád, hogy ez a metódus az enum értékeinek listáját adja vissza, de ez nyilvánvalóan túl egyszerű lenne, ezért ehelyett az enum által tartalmazott értékek számát adja vissza. Az értékek számának azonban semmi köze a tényleges értékekhez, ezért ezt a számot kell használnod az indexalapú metódusok meghívásának alapjául, nem az értékalapúakat.
Ha ezt a metódust indexes()-nek nevezték volna el, kevésbé lett volna zavaró ;-)
Azt is vedd figyelembe, hogy az enum értékek (és látszólag ezek az "indexek") 0-val kezdődnek, ellentétben az X++ tömb- és konténerindexeivel, amelyek 1-gyel kezdődnek, így az enum elemein való végighaladáshoz valami ilyesmit tehetsz:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Ez az enumban található egyes elemek szimbólumát és címkéjét kiírja az infologba.
További olvasmányok
Ha tetszett ez a bejegyzés, akkor ezek a javaslatok is érdekelhetik:
- Karakterláncformázás makróval és strFmt-vel a Dynamics AX 2012-ben
- A SysExtension Framework segítségével megtudhatja, melyik alosztályt kell példányosítani a Dynamics AX 2012-ben
- Az AIF-dokumentumszolgáltatások közvetlen hívása az X++-ból a Dynamics AX 2012-ben
