DAX’ta Değişkenler (VAR) ve Sık Görülen Hataların Nedenleri

DAX’ta değişkenler (VAR), karmaşık hesaplamaları daha yönetilebilir ve okunaklı hale getirmek için sıklıkla kullanılır. Değişkenler, uzun ve karmaşık formülleri daha küçük parçalara ayırarak hem kodun anlaşılmasını kolaylaştırır hem de hataların daha hızlı tespit edilmesine yardımcı olur.

Ancak, DAX’ta değişken kullanırken bazı sık görülen hatalar da mevcut. Bu yazıda değişkenleri inceliyoruz.

DAX’ta Değişken Nedir?

DAX’ta değişken VAR ifadesi kullanılarak tanımlanır. Belirli bir değeri veya ifadeyi geçici olarak saklamak için kullanılan bir nesnedir. Değişkenler, ölçüler (measures) içinde veya hesaplanan sütunlarda (calculated columns) kullanılabilir. Değişken isimlerinde Türkçe’ye özgü harfler kullanılamaz.

DAX’ta Değişkenlerin Avantajları:

Değişkenler oldukça kullanışlı ve özellikle birden fazla fonksiyon içeren her kod içinde tercih edilmesinin bazı avantajarı var.

  • Kod Okunabilirliği: Uzun ve karmaşık ifadeleri daha kısa ve anlaşılır parçalara ayırır.
  • Hara Azaltma: Kısa parçalara bölünen sorgularda hatalar hızla fark edilebilir.
  • Verimlilik: Aynı hesaplamayı birden fazla yerde kullanmak yerine, değişken tanımlanarak tekrar kullanılabilir.
    Bakım Kolaylığı: Değişen bir değeri güncellemek için tek bir yerde değişiklik yapmak yeterlidir.

Sintax:

Değişken tanımı VAR ile RETURN arasına yazılır. VAR sonrasında istenen değişken ismi ve ardından hesaplanmak istenen formül tanımlanır. İstenen sayıda değişken tanımlanabilir. Contoso örnek PBI dosyasından örneklerle devam edelim.

YTD Satışlar = 
VAR _YTD = 
    CALCULATE(
        SUMX(
            Sales,
            Sales[SalesQuantity] * Sales[UnitPrice]
        ),
        DATESYTD('Calendar'[DateKey],"31/12")
    )
RETURN _YTD

VAR ile RETURN arasına bir değişken tanımladık ve sorgunun ilerleyen aşamaları varsa istediğimiz noktada çağırabiliriz. Sıradaki örnekte önceki yıl satış rakamlarını da dahil edeceğimiz yeni bir ölçü oluşturalım.

YTD v Geçen Yıl Satışlar % Değişim = 

VAR _YTDSatislar = [YTD Satışlar]
VAR _YTDSatislarGecenYil =
    CALCULATE(
       [YTD Satışlar],
        SAMEPERIODLASTYEAR('Calendar'[DateKey])
    )
VAR _Degisim = 
    IF(
        _YTDSatislar <> 0 && _YTDSatislarGecenYil <> 0,
        [YTD Satışlar] - _YTDSatislarGecenYil
    )
VAR _DegisimYuzde = 
    DIVIDE(_Degisim, _YTDSatislarGecenYil)

RETURN _DegisimYuzde

_YTDSatislarGecenYil adlı değişkeni, DAX sorgusunun ilerleyen aşamalarında tekrar tekrar yazmaya gerek kalmadı. Bunun yerine VAR ile bir defa tanımladık ve sonraki aşamalarda çağırmamız yeterli oldu. Böylelikle DAX değişkeni bir kez hesapladı ve her aşamada aynı formülü hesaplamadığı için performans avantajı sağladı. Konudan sapmamak için bu örneğe değinmiyoruz. Ancak Contoso üzerinde aynı formülü VAR kullanmadan yazarsanız karmaşıklığına tanık olabilirsiniz.

DAX’ta VAR neden çalışmıyor?

DAX’ta tanımladığınız değişken yanlış sonuç mu veriyor? Gelin biraz da hata nedenlerine değinelim.

 Yukarıdaki örneği biraz kısaltalım biraz da dikkatli bakalım.  _YTDSatislarGecenYil isimli ölçüde kullandığımız CALCULATE() içerisine üstte tanımladığımız değişkeni çağırmadık. Doğrudan daha önce tanımladığımız ölçüyü çağırdık. Bunun da önemli bir nedeni var.

YTD v Geçen Yıl Satışlar % Değişim = 
VAR _YTDSatislar = [YTD Satışlar]
VAR _YTDSatislarGecenYil =
    CALCULATE(
       [YTD Satışlar], // ölçü
        SAMEPERIODLASTYEAR('Calendar'[DateKey])
    )

RETURN _YTDSatislarGecenYil 

VAR ile tanımlanan değişkenler doğrudan ölçü referansı olsa da immutable’dır. Bir başka deyişle, tanımlandığında sabit değer alır. CALCULATE() içerisine “değişkeni” çağırsaydık, değişken filtre bağlamını tetikleyemeyecek ve formül geçen yıl değerini hesaplamayacaktı. Bu sorunun önüne geçmek için önce “ölçü” oluşturduk, daha sonra oluşturduğumuz ölçüyü çağırdık. 

Önceki yılın satışlarını hesaplayan bir ölçü yazarak görselleştirelim. Ancak farklı olarak bu ölçüde değişkeni çağıralım. SAMEPERIODLASTYEAR() filtresi çalışmayacak ve sonuç YTD tutarını verecekti.

YTD Geçen Yıl Satışlar = 
VAR _YTDSatislar = [YTD Satışlar]
VAR _YTDSatislarGecenYil =
    CALCULATE(
      _YTDSatislar, // Değişken
        SAMEPERIODLASTYEAR('Calendar'[DateKey])
    )
RETURN _YTDSatislarGecenYil 

İç içe VAR kullanımı

Sıradaki örneğimiz iç içe değişken kullanılabilmesi üzerine. İteratörler içinde değişken tanımlamanın farkı üzerine kısaca değinelim.

Çoklu VAR = 

VAR _Maliyet =
    SUMX(
        Sales,
        VAR SA = Sales[SalesQuantity]
        VAR SM = Sales[UnitCost]
        RETURN SA * SM
    )

RETURN _Maliyet

İteratörler ile kullanırken değişkenin iteratörün içinde ya da dışında yer alıyor olması önemlidir.
SUMX() içerisinde satır bağlamı oluşuyor ve SalesQuantity ile UnitCost satırlarındaki değerleri, bu bağlamda değişken olarak tanımlayabiliyoruz. Örneğimizde SUMX() dışında bu değişkenleri tanımlayamazdık çünkü satır bağlamı olmadığı için bir toplama fonksiyonuna ihtiyaç duyulurdu.  Örneğin 

  • VAR SM = Sales[UnitCost] yazamazdık
    VAR SM = Average(Sales[UnitCost]) gibi bir toplama fonksiyonu kullanabilirdik ancak bu noktada işimize yaramazdı. 

Sonuç

DAX’ta değişkenler, ölçü yazımını daha esnek, okunaklı ve verimli hale getirir. Karmaşık hesaplamaları daha küçük parçalara bölerek hem kodun daha kolay anlaşılmasını hem de hataların daha kolay bulunmasını sağlar. Bugün DAX’ta VAR kullanımına ve sık karşılaşılan hatalara değindik. Bir sonraki yazıda görüşmek üzere DAX’la kalın..