כיצד לחזור על האלמנטים של Enum מקוד X++ ב- Dynamics AX 2012
פורסם: 15 בפברואר 2025 בשעה 23:11:13 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. במקום ליצור באופן ידני את השדות (ולאחר מכן צריך לשמור על הטופס אם ה-enum ישתנה אי פעם), החלטתי ליישם אותו באופן דינמי כך שהוא יוסיף אוטומטית את השדות לעיצוב בזמן הריצה.
עם זאת, עד מהרה גיליתי שלמעשה איטרציה על הערכים במניין, אמנם קלה מספיק ברגע שאתה יודע איך, היא קצת מבלבלת.
ברור שאתה צריך להתחיל עם שיעור DictEnum. כפי שתראה, למחלקה זו יש מספר שיטות להשגת מידע כגון שם ותווית הן מהאינדקס והן מהערך.
ההבדל בין אינדקס לערך הוא שהאינדקס הוא מספר של אלמנט ב-enum, אם האלמנטים של ה-enum היו ממוספרים ברצף החל מאפס, בעוד שערך הוא תכונת ה"ערך" האמיתית של האלמנט. מכיוון שלרוב ה-enums יש ערכים הממוספרים ברצף מ-0, האינדקס והערך של אלמנט יהיו לרוב זהים, אבל בהחלט לא תמיד .
אבל איך יודעים אילו ערכים יש ל-enum? כאן זה נהיה מבלבל. למחלקה DictEnum יש שיטה הנקראת values(). אתה יכול לצפות ששיטה זו תחזיר רשימה של ערכי ה-enum, אבל ברור שזה יהיה קל מדי, אז במקום זאת היא מחזירה את מספר הערכים שה-enum מכיל. עם זאת, למספר הערכים אין שום קשר לערכים בפועל, לכן עליך להשתמש במספר זה כבסיס לקריאה לשיטות המבוססות על אינדקס, ולא לשיטות המבוססות על ערכים.
אם רק היו קוראים לשיטה הזו indexes() במקום, זה היה פחות מבלבל ;-)
זכור גם שערכי ה-enum (וכנראה ה"אינדקסים" הללו) מתחילים ב-0, שלא כמו אינדקסים של מערך ו-container ב-X++, שמתחילים ב-1, אז כדי לבצע לולאה על האלמנטים ב-enum, תוכל לעשות משהו כזה:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
זה יוציא את הסמל והתווית של כל אלמנט ב-enum ל-infolog.