Ölçü patlaması
5 temel ölçün (Satış, Kâr, Adet, Sipariş, Müşteri) ve 6 zaman varyasyonun (Cari, GY, YTD, GY YTD, YoY, YoY %) varsa 30 ölçü yazman gerekir. Hesaplama grupları bu varyasyonları bir kez tanımlar ve her ölçüye uygular.
-- Hesaplama grubu: Zaman Zekâsı, öğeler:
Cari = SELECTEDMEASURE()
GY = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(Tarih[Tarih]))
YTD = CALCULATE(SELECTEDMEASURE(), DATESYTD(Tarih[Tarih]))
YoY % = VAR c = SELECTEDMEASURE()
VAR g = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(Tarih[Tarih]))
RETURN DIVIDE(c - g, g)
SELECTEDMEASURE(), görselde o an kullanılan ölçünün yerine geçer. Hesaplama grubu modelde bir tablo gibi görünür; öğelerini matrisin sütununa koyduğunda her ölçü için altı varyasyon kendiliğinden gelir. Öğeler biçim dizesi ifadesi de taşıyabilir: YoY % öğesi sonucu yüzde olarak gösterir.
Desktop'ta Model görünümünde Hesaplama grubu düğmesiyle (ya da Tabular Editor ile) oluşturulur. Hesaplama grubu eklenince örtük ölçüler kapanır; tüm değerler açık ölçü olmalıdır.
Alan parametreleri
Modelleme → Yeni parametre → Alanlar. Kullanıcıya bir dilimleyiciden “Grafiğin ekseni: Kategori / Kanal / Segment” ya da “Değer: Satış / Kâr / Adet” seçtirirsin. Arka planda özel bir tablo ve NAMEOF fonksiyonu kullanılır.
Görsel hesaplamalar
Görselin kendisinde, yalnızca görseldeki verilerle çalışan DAX hesapları. Model ölçüsü yazmadan kümülatif toplam, hareketli ortalama, önceki satıra göre fark:
Kümülatif = RUNNINGSUM([Net Satış]) Öncekine Göre = [Net Satış] - PREVIOUS([Net Satış])
Görsel hesaplamalar matris ızgarası üzerinde düşünür (satırlar, sütunlar, üst düzey). Model ölçülerinden daha basit yazılır ama yalnızca o görselde yaşar.
Dinamik biçim dizeleri
Ölçü araçları → Biçim → Dinamik. Ölçünün yanında, sonucun nasıl yazılacağını döndüren ikinci bir DAX ifadesi tanımlanır; sonuç sayı olarak kalır (sıralanır, grafikte kullanılır) ama biçimi bağlama göre değişir:
-- [Satış (Seçili Para)] ölçüsünün biçim dizesi ifadesi:
VAR Sembol = SELECTEDVALUE(ParaBirimleri[Sembol], "₺")
RETURN "#,0 " & Sembol
-- Büyüklüğe göre biçim:
SWITCH(TRUE(),
SELECTEDMEASURE() >= 1000000, "#,0.0,, "Mn"",
SELECTEDMEASURE() >= 1000, "#,0.0, "B"",
"#,0")
FORMAT ile metne çevirmenin (Measure Lab: Akıllı Etiket) aksine, dinamik biçim dizesi sayının kendisini korur.
Alan parametresi, adım adım
- Modelleme → Yeni parametre → Alanlar.
- Listeye ölçüleri (Net Satış, Brüt Kâr, Sipariş Sayısı) ya da sütunları (Kategori, Kanal, Segment) ekle; sırala, yeniden adlandır.
- “Sayfaya dilimleyici ekle” işaretli bırak. Power BI bir parametre tablosu oluşturur; her satırda
NAMEOF('Ölçüler'[Net Satış])gibi bir başvuru vardır. - Parametre sütununu görselin eksenine ya da değerine koy. Kullanıcı dilimleyiciden seçtikçe görsel alan değiştirir.
Ölçülerle alan parametresi “ölçü seçici”, sütunlarla “eksen seçici” olur. İkisi aynı görselde birlikte kullanılabilir. Bu uygulamadaki OlcuSecimi tablosu ve [Seçili Ölçü] ölçüsü, alan parametresi gelmeden önceki SWITCH tabanlı yöntemin benzetimidir.
Birden çok hesaplama grubu: öncelik (precedence)
Finans müdürü iki şey istiyor: her ölçüyü YTD görmek ve her ölçüyü gün başına görmek. Ekip iki ayrı hesaplama grubu kurar: Zaman (Cari, GY, YTD) ve Ölçek (Toplam, Gün Başına). Matriste ikisinden birer öğe seçilince motor iki öğeyi iç içe uygular. Hangisinin içte, hangisinin dışta olacağını grubun Öncelik (Precedence) özelliği belirler.
Kural şudur: düşük öncelikli grup içte, yüksek öncelikli grup dışta çalışır. Motor en yüksek öncelikli öğeden başlar; o öğedeki SELECTEDMEASURE() yerine bir alttaki öğeyi koyar; en sonda gerçek ölçüye ulaşır. Ölçek grubu 10, Zaman grubu 20 ise “Gün Başına + YTD” şuna dönüşür:
Günlük Ort. YTD (Zaman dışta) = CALCULATE(DIVIDE([Net Satış], COUNTROWS(Tarih)), DATESYTD(Tarih[Tarih])) Günlük Ort. YTD (Ortalama dışta) = DIVIDE(CALCULATE([Net Satış], DATESYTD(Tarih[Tarih])), COUNTROWS(Tarih))
Mart 2024 hücresinde ilk yazım 1.707,59 ₺ verir: Ocak–Mart toplamı, Ocak–Mart gün sayısına bölünür. Öncelikler ters verilirse ikinci yazım çalışır ve 5.012,60 ₺ çıkar: üç aylık toplam yalnızca Mart'ın 31 gününe bölünür. İki sayı da “doğru hesaplanmış” görünür; yalnızca biri iş sorusunun cevabıdır. Öncelik bir teknik ayrıntı değil, iş kuralıdır.
| Grup türü | Önerilen yer | Neden |
|---|---|---|
| Para birimi çevirisi, ölçek (bin/milyon), gün başına | Düşük öncelik (içte) | Önce tek tek değerler dönüşür, sonra zaman penceresi uygulanır |
| Zaman zekâsı (YTD, GY, YoY %) | Yüksek öncelik (dışta) | Pencere, dönüşmüş değerin tamamını sarmalı |
| Yalnızca biçim değiştiren grup | En yüksek | Biçim dizesinde en yüksek öncelikli grubun ifadesi kazanır |
Biçim dizeleri de öncelikle yarışır: en yüksek öncelikli grubun dinamik biçim dizesi geçerli olur; ölçünün kendi biçimi her hesaplama grubunun altında kalır. “YoY % neden ₺ ile görünüyor?” sorusunun cevabı çoğu zaman budur.
ISSELECTEDMEASURE: öğeyi her ölçüye uygulama
Zaman grubundaki YoY % öğesi [Net Satış] için anlamlıdır. Ama [Kâr Marjı %] için “marjın yüzde değişimi” çıkar: %20'den %22'ye çıkan marj “%10 büyüme” olarak görünür. Finans ise “2 puan arttı” demek ister. Metin döndüren ölçülerde (ör. [Hedef Durumu], [Dinamik Başlık]) durum daha kötüdür: öğedeki aritmetik “metin sayıya çevrilemiyor” hatası verir.
-- Zaman grubu, "YoY" öğesi
VAR Simdi = SELECTEDMEASURE()
VAR Once = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(Tarih[Tarih]))
RETURN
SWITCH(TRUE(),
NOT ISNUMBER(Simdi), BLANK(), -- metin ölçüleri: dokunma
ISSELECTEDMEASURE([Kâr Marjı %], [Ortalama İndirim %]), (Simdi - Once) * 100, -- oranlar: puan farkı
DIVIDE(Simdi - Once, Once)) -- tutarlar: yüzde değişim
-- Aynı öğenin dinamik biçim dizesi
IF(ISSELECTEDMEASURE([Kâr Marjı %], [Ortalama İndirim %]), "+0.0"" puan"";-0.0"" puan""", "+0.0%;-0.0%")
ISSELECTEDMEASURE ölçüye başvuru alır; ölçü yeniden adlandırılınca başvuru da güncellenir. SELECTEDMEASURENAME() = "Kâr Marjı %" gibi metin karşılaştırması da çalışır, ama ilk yeniden adlandırmada sessizce bozulur. SELECTEDMEASUREFORMATSTRING() ise “ölçünün kendi biçimini koru” demenin yoludur; Cari ve GY öğelerinin biçim dizesine bunu yazarsan ₺ ölçüler ₺, adet ölçüleri adet kalır.
Seçim ifadeleri: çoklu ya da boş seçim
Bir dilimleyiciden aynı gruptan iki öğe seçildiğinde ne olur? Hesaplama öğesi yalnızca bağlamda tek öğe varken uygulanır. Varsayılan davranışta iki öğe seçilirse grup hiç uygulanmaz ve ölçü olduğu gibi görünür. Kullanıcı “YTD ve GY” seçtiğini sanırken çıplak cari değeri görür. Bunu iki isteğe bağlı grup özelliği yönetir:
| Durum | İfade tanımlı değilse | Tanımlıysa |
|---|---|---|
| Tek öğe seçili | Öğe uygulanır | Öğe uygulanır |
| Birden çok öğe ya da çakışan seçim | Grup uygulanmaz | multipleOrEmptySelectionExpression sonucu |
| Grup hiç filtrelenmemiş | Grup uygulanmaz | noSelectionExpression sonucu |
Para birimi grubunda tipik kullanım: hiçbir şey seçilmemişse TL göster (noSelectionExpression), iki para birimi seçilmişse sayı yerine BLANK döndür ve biçim dizesinde “Tek para birimi seç” yaz. Yanlış rakam göstermek, boş göstermekten her zaman daha pahalıdır.
Yan etkiler: grup eklenince neler değişir?
- Örtük ölçüler kapanır. Modelde “örtük ölçüleri engelle” (Discourage implicit measures) açılır; sütunların yanındaki Σ kaybolur,
Satislar[Tutar]artık değer alanına sürüklenemez. Var olan görseller çalışmaya devam eder, ama rapor yazarları için her toplam açık bir ölçü olmalıdır. - Tüm ölçüler “variant” türüne geçer. Rapor tarafında ölçünün veri türü sabit değildir. Bir ölçünün dinamik biçim dizesini başka yerde yeniden kullanıyorsan hata görebilirsin; ifadeyi
FORMAT(…, "")ile sarmak çözüm yoludur. - Güvenlik: Hesaplama grubu tablosuna RLS ya da OLS tanımlanamaz. Güvenlik diğer tablolarda kalır (Satır ve nesne düzeyinde güvenlik dersi).
- Aynı gruptan iki öğe birleşmez. “GY'nin YTD'si” tek gruptan iki öğeyle yapılamaz; ya iki ayrı grup ya da öğe içinde yan özyineleme (sideways recursion): öğe,
CALCULATE(SELECTEDMEASURE(), Zaman[Hesap] = "GY")ile kardeş öğeyi çağırabilir. - Ölçü içinden çağırma:
CALCULATE([Net Satış], Zaman[Hesap] = "YTD")geçerlidir. Bu, “YTD Satış” ölçüsünü ayrıca yazmadan bir kart görseline koymanın yoludur.
Alan parametresiyle birlikte kullanmak
Yönetim panosunda kullanıcı bir dilimleyiciden ölçüyü seçer (Net Satış, Brüt Kâr, Sipariş Sayısı); matrisin sütunlarında Zaman grubunun öğeleri durur. Ölçü seçiciyi alan parametresi (field parameter), varyasyonları hesaplama grubu sağlar: 3 ölçü × 3 öğe için tek ölçü yazmazsın. Dikkat edilecekler:
- Alan parametresinde örtük ölçü kullanılamaz; zaten hesaplama grubu da bunu istemez.
- Alan parametresi dilimleyicisinde hiçbir şey seçmemek “hepsi seçili” demektir; görsel birden çok ölçüyle dolar. Dilimleyiciyi “tek seçim” yap.
- Biçim: Zaman grubunun YoY öğesi biçimi ezer; kart başlığında ölçü adını göstermek için parametre tablosunun görünen ad sütununu kullan.
| Yol | Ne zaman? | Bakım | Dikkat |
|---|---|---|---|
| Hesaplama grubu | Aynı dönüşüm birçok ölçüye uygulanacaksa | Tek yerde; yeni ölçü kendiliğinden kapsanır | Öncelik, variant tür, örtük ölçüler |
| Alan parametresi | Kullanıcı ölçü ya da eksen seçecekse | Kolay; Desktop arayüzü | Boş seçim = hepsi |
SWITCH ölçüsü ([Seçili Görünüm]) | Az sayıda, özel mantık | Her ölçü için ayrı dal | Dallar çoğaldıkça okunmaz olur |
| Görsel hesaplama | Tek görsele özel kümülatif/fark | Yalnızca o görselde | Başka görselde yeniden kullanılamaz |
Test etmek: önce sorguyla, sonra görselle
Hesaplama grubunu yayımlamadan önce DAX sorgu görünümünde (DAX query view) yıl × öğe ızgarası çıkar ve bilinen sayılarla karşılaştır. Bu oyun alanında aynı fikri Gorunum tablosu ve [Seçili Görünüm] ölçüsüyle deneyebilirsin:
EVALUATE SUMMARIZECOLUMNS(Tarih[Yil], Gorunum[Gorunum], "Değer", [Seçili Görünüm])
Sonuçta iki sağlama hemen görünür. Yıl düzeyinde YTD = Cari olmalı: 2024 için ikisi de 747.065,70 ₺. 2024'ün GY'si = 2023'ün Carisi olmalı: 400.869,55 ₺. 2022'de GY ve YoY % satırı hiç gelmez, çünkü önceki yıl yok; BLANK olan satırı SUMMARIZECOLUMNS atar. Bu üç kural tutmuyorsa öğede ya da tarih tablosunda sorun vardır.