Dynamics AX 2012'de X++ Kodundan Bir Enumun Elemanları Üzerinde Yineleme Nasıl Yapılır
Yayınlandı: 15 Şubat 2025 23:11:00 UTC
Bu makalede, Dynamics AX 2012'de bir temel enumun öğelerinin nasıl numaralandırılacağı ve bunlar üzerinde nasıl döngü oluşturulacağı açıklanmakta olup, bir X++ kod örneği de yer almaktadır.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Bu gönderideki bilgiler Dynamics AX 2012 R3'e dayanmaktadır. Diğer sürümler için geçerli olabilir veya olmayabilir.
Yakın zamanda bir enum'daki her bir öğe için bir değer görüntülemesi gereken bir form oluşturuyordum. Alanları manuel olarak oluşturmaktan (ve daha sonra enum değiştirilirse formu korumak zorunda kalmaktan) ziyade, çalışma zamanında alanları tasarıma otomatik olarak ekleyecek şekilde dinamik olarak uygulamaya karar verdim.
Ancak, bir enum'daki değerler üzerinde yineleme yapmanın, nasıl yapılacağını öğrendikten sonra yeterince kolay olsa da, biraz kafa karıştırıcı olduğunu kısa sürede keşfettim.
Açıkça DictEnum sınıfıyla başlamanız gerekiyor. Göreceğiniz gibi, bu sınıfın hem indeksten hem de değerden isim ve etiket gibi bilgileri elde etmek için çeşitli yöntemleri var.
Dizin ve değer arasındaki fark, dizinin, enum'un öğeleri sıfırdan başlayarak ardışık olarak numaralandırılmışsa, enum'daki bir öğenin numarası olması, değerin ise öğenin gerçek "değer" özelliği olmasıdır. Çoğu enum'un 0'dan başlayarak ardışık olarak numaralandırılmış değerleri olduğundan, bir öğenin dizini ve değeri genellikle aynı olacaktır, ancak kesinlikle her zaman olmayacaktır.
Ancak bir enum'un hangi değerlere sahip olduğunu nasıl bileceksiniz? Kafa karıştırıcı olan nokta burasıdır. DictEnum sınıfının values() adında bir yöntemi vardır. Bu yöntemin enum'un değerlerinin bir listesini döndürmesini bekleyebilirsiniz, ancak bu açıkça çok kolay olurdu, bu nedenle bunun yerine enum'un içerdiği değer sayısını döndürür. Ancak, değer sayısının gerçek değerlerle hiçbir ilgisi yoktur, bu nedenle bu sayıyı değer tabanlı olanları değil, dizin tabanlı yöntemleri çağırmak için bir temel olarak kullanmanız gerekir.
Keşke bu metoda indexes() adını verselerdi, daha az kafa karıştırıcı olurdu ;-)
Ayrıca, enum değerlerinin (ve görünüşe göre bu "indekslerin") X++'daki dizi ve kapsayıcı indekslerin 1'den başlamasının aksine 0'dan başladığını unutmayın; dolayısıyla bir enum'daki öğeler üzerinde döngü oluşturmak için şöyle bir şey yapabilirsiniz:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Bu, enumdaki her bir öğenin sembolünü ve etiketini infolog'a çıktı olarak verecektir.