Cara Mengulangkan Elemen Enum daripada Kod X++ dalam Dynamics AX 2012
Diterbitkan: 19 Mac 2025 pada 9:32:54 PTG UTC
Artikel ini menerangkan cara menghitung dan menggelungkan elemen enum asas dalam Dynamics AX 2012, termasuk contoh kod X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Maklumat dalam catatan ini adalah berdasarkan Dynamics AX 2012 R3. Ia mungkin sah atau tidak sah untuk versi lain.
Saya baru-baru ini mencipta satu borang yang perlu memaparkan nilai untuk setiap elemen dalam enum. Daripada mencipta medan secara manual (dan kemudian perlu menyelenggara borang tersebut jika enum pernah diubah), saya memutuskan untuk melaksanakannya secara dinamik supaya ia akan menambah medan ke reka bentuk secara automatik semasa waktu operasi.
Namun, saya segera mendapati bahawa sebenarnya mengulangi nilai-nilai dalam enum, walaupun cukup mudah apabila anda tahu caranya, agak mengelirukan.
Anda jelas perlu bermula dengan kelas DictEnum. Seperti yang anda akan lihat, kelas ini mempunyai beberapa kaedah untuk mendapatkan maklumat seperti nama dan label daripada indeks dan nilai.
Perbezaan antara indeks dan nilai adalah bahawa indeks adalah nombor elemen dalam enum, jika elemen enum dinamakan secara berurutan bermula dari sifar, manakala nilai adalah sifat "nilai" sebenar elemen tersebut. Oleh kerana kebanyakan enum mempunyai nilai yang dinomborkan secara berurutan dari 0, indeks dan nilai bagi elemen akan selalunya sama, tetapi sudah pasti tidak sentiasa sama.
Tetapi bagaimana anda tahu nilai-nilai yang ada dalam enum? Di sinilah ia menjadi mengelirukan. Kelas DictEnum mempunyai kaedah yang dipanggil values(). Anda mungkin mengharapkan kaedah ini mengembalikan senarai nilai enum, tetapi itu sudah tentu terlalu mudah, jadi sebaliknya ia mengembalikan bilangan nilai yang terdapat dalam enum tersebut. Namun, bilangan nilai tidak ada kaitan dengan nilai sebenar, jadi anda perlu menggunakan nombor ini sebagai asas untuk memanggil kaedah berasaskan indeks, bukan yang berasaskan nilai.
Jika sahaja mereka menamakan kaedah ini indexes() sebaliknya, ia pasti akan kurang mengelirukan ;-)
Juga perlu diingat bahawa nilai enum (dan nampaknya "indeks" ini) bermula dari 0, berbeza dengan indeks array dan kontena dalam X++, yang bermula dari 1, jadi untuk mengulangi elemen dalam enum anda boleh lakukan sesuatu seperti ini:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Ini akan mengeluarkan simbol dan label bagi setiap elemen dalam enum ke infolog.