डायनॅमिक्स AX २०१२ मध्ये X++ कोडमधील एनमच्या घटकांवर पुनरावृत्ती कशी करावी
प्रकाशित: १५ फेब्रुवारी, २०२५ रोजी ११:११:१६ PM UTC
हा लेख डायनॅमिक्स AX २०१२ मध्ये बेस एनमच्या घटकांची गणना कशी करायची आणि त्यावर लूप कसे करायचे ते स्पष्ट करतो, ज्यामध्ये X++ कोड उदाहरण देखील समाविष्ट आहे.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
या पोस्टमधील माहिती डायनॅमिक्स AX २०१२ R3 वर आधारित आहे. ती इतर आवृत्त्यांसाठी वैध असू शकते किंवा नसू शकते.
मी अलिकडेच एक फॉर्म तयार करत होतो ज्यामध्ये एनममधील प्रत्येक घटकासाठी मूल्य प्रदर्शित करणे आवश्यक होते. फील्ड मॅन्युअली तयार करण्याऐवजी (आणि नंतर एनममध्ये कधीही बदल केल्यास फॉर्म राखण्याची आवश्यकता होती), मी ते गतिमानपणे अंमलात आणण्याचा निर्णय घेतला जेणेकरून ते रन टाइममध्ये डिझाइनमध्ये स्वयंचलितपणे फील्ड जोडेल.
तथापि, मला लवकरच असे आढळून आले की एनममधील मूल्यांवर प्रत्यक्षात पुनरावृत्ती करणे, जरी तुम्हाला कसे करावे हे माहित झाल्यानंतर पुरेसे सोपे असले तरी, थोडे गोंधळात टाकणारे आहे.
तुम्हाला अर्थातच DictEnum क्लासपासून सुरुवात करावी लागेल. तुम्हाला दिसेल की, या क्लासमध्ये इंडेक्स आणि व्हॅल्यू दोन्हीमधून नाव आणि लेबल सारखी माहिती मिळविण्याच्या अनेक पद्धती आहेत.
इंडेक्स आणि व्हॅल्यूमधील फरक असा आहे की जर एनमचे घटक शून्यापासून सुरू होऊन क्रमाने क्रमांकित केले असतील तर इंडेक्स हा एनममधील घटकाचा क्रमांक असतो, तर व्हॅल्यू हा घटकाचा वास्तविक "व्हॅल्यू" गुणधर्म असतो. बहुतेक एनम्समध्ये व्हॅल्यूज 0 पासून क्रमाने क्रमांकित केल्या जातात, त्यामुळे घटकाचा निर्देशांक आणि मूल्य बहुतेकदा सारखेच असते, परंतु नेहमीच नाही.
पण तुम्हाला कसे कळेल की enum मध्ये कोणती व्हॅल्यूज आहेत? इथेच गोंधळ होतो. DictEnum क्लासमध्ये values() नावाची एक पद्धत आहे. तुम्हाला कदाचित ही पद्धत enum च्या व्हॅल्यूजची यादी परत करेल अशी अपेक्षा असेल, परंतु ते खूप सोपे असेल, म्हणून त्याऐवजी ते enum मध्ये असलेल्या व्हॅल्यूजची संख्या परत करते. तथापि, व्हॅल्यूजच्या संख्येचा प्रत्यक्ष व्हॅल्यूजशी काहीही संबंध नाही, म्हणून तुम्हाला व्हॅल्यू-बेस्ड मेथड्स कॉल करण्यासाठी आधार म्हणून हा नंबर वापरावा लागेल, व्हॅल्यू-बेस्ड मेथड्स नाही.
जर त्यांनी या पद्धतीला indexes() असे नाव दिले असते तर ते कमी गोंधळात टाकणारे ठरले असते ;-)
हे देखील लक्षात ठेवा की enum व्हॅल्यूज (आणि हे "इंडेक्सेस") 0 पासून सुरू होतात, X++ मधील अॅरे आणि कंटेनर इंडेक्सेस 1 पासून सुरू होतात त्यापेक्षा वेगळे, म्हणून enum मधील घटकांना लूप करण्यासाठी तुम्ही असे काहीतरी करू शकता:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
हे enum मधील प्रत्येक घटकाचे चिन्ह आणि लेबल इन्फोलॉगमध्ये आउटपुट करेल.