كيفية تكرار عناصر Enum من كود X++ في Dynamics AX 2012
نُشرت: ١٥ فبراير ٢٠٢٥ م في ١١:٠٩:٥٥ م 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. وقد تكون صالحة أو غير صالحة للإصدارات الأخرى.
كنت أقوم مؤخرًا بإنشاء نموذج يتطلب عرض قيمة لكل عنصر في مجموعة من العناصر. وبدلاً من إنشاء الحقول يدويًا (ثم الحاجة إلى صيانة النموذج في حالة تعديل المجموعة من العناصر)، قررت تنفيذه ديناميكيًا بحيث يضيف الحقول تلقائيًا إلى التصميم في وقت التشغيل.
ومع ذلك، سرعان ما اكتشفت أن تكرار القيم في التعداد، على الرغم من أنه أمر سهل بما فيه الكفاية بمجرد معرفة كيفية القيام بذلك، إلا أنه مربك بعض الشيء.
من الواضح أنك بحاجة إلى البدء بفئة DictEnum. وكما سترى، تحتوي هذه الفئة على عدة طرق للحصول على معلومات مثل الاسم والتسمية من كل من الفهرس والقيمة.
الفرق بين الفهرس والقيمة هو أن الفهرس هو رقم العنصر في التعداد، إذا تم ترقيم عناصر التعداد بشكل متسلسل بدءًا من الصفر، بينما القيمة هي خاصية "القيمة" الفعلية للعنصر. نظرًا لأن معظم التعدادات لها قيم مرقمة بشكل متسلسل من 0، فإن الفهرس وقيمة العنصر سيكونان متماثلين غالبًا ، ولكن بالتأكيد ليس دائمًا .
ولكن كيف تعرف القيم التي يحتوي عليها التعداد؟ هنا يصبح الأمر مربكًا. تحتوي فئة DictEnum على طريقة تسمى values(). قد تتوقع أن تقوم هذه الطريقة بإرجاع قائمة بقيم التعداد، ولكن من الواضح أن هذا سيكون سهلاً للغاية، لذا فإنها تقوم بدلاً من ذلك بإرجاع عدد القيم التي يحتوي عليها التعداد. ومع ذلك، فإن عدد القيم لا علاقة له بالقيم الفعلية، لذا تحتاج إلى استخدام هذا العدد كأساس لاستدعاء الطرق القائمة على الفهرس، وليس الطرق القائمة على القيمة.
لو أنهم أطلقوا على هذه الطريقة اسم indexes() بدلاً من ذلك، لكان الأمر أقل إرباكًا ;-)
ضع في اعتبارك أيضًا أن قيم التعداد (وعلى ما يبدو هذه "الفهارس") تبدأ من 0، على عكس فهرس المصفوفة والحاوية في X++، والتي تبدأ من 1، لذلك للتكرار على العناصر في التعداد يمكنك القيام بشيء مثل هذا:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
سيؤدي هذا إلى إخراج الرمز والعلامة لكل عنصر في التعداد إلى سجل المعلومات.