DAX’ın işleyiş mantığını anlamak için oldukça önemli olan bağlam geçişi kavramı, satır bağlamından filtre bağlamına geçişi ifade etmek için kullanılır. Başka bir deyişle, bir ölçü ya da hesaplanan sütun üzerinde yapılan işlemler, satır bağlamından filtre bağlamına geçerek daha kapsamlı ve etkileşimli hesaplamalar yapmamıza olanak tanır. Bugünkü yazımızda, context transition yani bağlam geçişi konusuna değiniyoruz.
Filtre bağlamı ve satır bağlamı konularını henüz okumadıysanız linklerden ulaşabilirsiniz:
DAX’ta Bağlamlara Giriş 1: Row Context (Satır Bağlamı) nedir
DAX’ta Bağlamlara Giriş 2: Filter Context (Filtre Bağlamı) nedir
Bağlam Geçişi Nedir?
Bağlam geçişi, satır bağlamından filtre bağlamına geçişi ifade eder. CALCULATE() ve CALCULATETABLE() fonksiyonları ile tetiklenir. Bir ölçüye referans verildiğinde de aynı tetikleme gerçekleşir. Çünkü ölçüyü tanımlayan DAX formülünde yazılmasa da CALCULATE() oradadır.
Uygulayarak takip etmek isteyenler Contoso örnek Power BI dosyasını buradan indirebilir.
Hesaplanmış sütun, satır bağlamını en kolay gözlemleyeceğimiz örnek olduğu için, satışlar tablosu görünümü ekranında hesaplanmış bir sütun ekleyerek başlayalım. Hesaplanmış sütun formülümüz ve satırdaki karşılığı:
Satış Döviz Tutarı (Filtre Bağlamı olmadan) =
SUMX(
Sales,
Sales[SalesQuantity] * Sales[UnitPrice]
)
Hesaplanmış sütunda formülü yazdık ama neden tek sonuç olarak satış tablosu genel toplamını görüyoruz?
Bu aşamada filtre bağlamına geçmediğimiz için, sales tablosundaki satırlara göre filtrelenmiş bilgileri getiremiyoruz. Hesaplanmış sütunun her satırında aynı sonucu, Sales tablosundaki satışların genel toplamını görüyoruz. Satır bağlamının içerisinde CALCULATE() fonksiyonunu kullandığımızda, satır bağlamından filtre bağlamına geçmiş oluyoruz ve istediğimiz filtreleme gerçekleşiyor.
Satış Döviz Tutarı (Filtre Bağlamı İle) =
CALCULATE(
SUMX(
Sales,
Sales[SalesQuantity] * Sales[UnitPrice]
)
)
İlk hesaplanmış sütun örneğine geri dönelim ancak bu sefer aynı formülü kullanarak hesaplanmış sütun değil de, aynı formülü kullanan bir ölçü oluşturalım ve matrix görselimizin içerisine yerleştirelim:
Satış Döviz Tutarı (Filtre Bağlamı olmadan) =
SUMX(
Sales,
Sales[SalesQuantity] * Sales[UnitPrice]
)
Matrix görselimizin filtrelediğini görüyoruz. Ancak nasıl oluyor? Satış tablosundaki genel toplamı vermesi gerekmiyor muydu? SUMX() satır bağlamı örneği değil miydi? SUMX() nasıl oluyor da ClassName ve BrandName filtrelerine göre sonuçlar verebiliyor? Filtre bağlamı değil miydi bu sonuçları üreten?
Hesaplanmış sütunlardan ölçülere geçtiğimizde ilk bahsedilmesi gereken konu aslında ölçü oluşturduğumuzda gizlenmiş bir CALCULATE() olması. Eğer bir ölçü oluşturduysanız, siz formülde yazmasanız da ölçünün içinde görmeseniz de CALCULATE() fonksiyonu her zaman oradadır. Bu yüzden ölçü oluştuğunda, SUMX() fonksiyonu başına görünmeyen bir CALCULATE() alarak filtreleme yapabiliyor.
CALCULATE(
SUMX(
Sales,
Sales[SalesQuantity] * Sales[UnitPrice]
)
)
CALCULATE() fonksiyonunun denkleme girmesi ile bağlam geçişi gerçekleşiyor ve satır bağlamında yazdığımız formül artık veri modeli ölçeğinde kullanılabilir hale geliyor. ilişkilerin değiştirilmesi, filtrelerin uygulanması, filtrelerin kaldırılması, görseller tarafından filtrelenmesi gibi bir çok harici özelliği de kazanmış oluyor.
Bağlam geçişi konusunu ele aldıktan sonra bağlamlar konusunun sonuna geldik diyemiyoruz, yalnızca konsepti anlatan kısa bir giriş yapmış olduk. Çünkü bağlam algısı her yazılan ölçüde vardır ve ölçü yazdıkça gelişir. Bağlamları doğru anlamak, hatalardan kaçınmanın anahtarıdır. Çoğu zaman ölçülerde ya da toplamlarda istenen sonuçların elde edilememesi, farkında olmadan göz ardı edilmesinden kaynaklanır. Bu yüzden ölçü yazarken her adımda bağlamları göz önünde bulundurmak, DAX formüllerinin ve dolayısıyla raporların başarısının temelini oluşturur.