Ana içeriğe geç
Kesit Power BI
Orta · Yönetim ve Güvenlik

Rapor kalitesi: veri mutabakatı, ölçü testleri, belgeleme ve kabul testi

Raporun sayılarını kaynakla eşleştir, beklenen değerlerle bir DAX sorgu test paketi kur, uç durumları dene, ölçüleri bir veri sözlüğüyle belgele, sürüm notu yaz ve yayımlamadan önce kullanıcı kabul testini yönet.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Finans uzmanı yazıyor: “Raporunuz toplam satışı 1.250.772,45 ₺ diyor, bizim ERP dökümü 1.346.189,85 ₺. Hangisi doğru?” İkisi de doğru olabilir. Fark tam olarak 95.417,40 ₺ ve bu, iptal edilen satırların tutarıdır: ERP tüm satırları topluyor, rapordaki [Net Satış] iptalleri dışlıyor. Bu cevabı beş dakikada verebilmek için mutabakatı önceden yapmış olman gerekir. Kullanıcı bir kez “bu rapor yanlış” derse, sonra doğru da olsa güveni geri kazanmak zordur.

Veri mutabakatı: rapor kaynağı tutuyor mu?

Mutabakat (reconciliation), rapordaki sayıların kaynak sistemdeki sayılarla aynı kurala göre aynı sonucu verdiğini göstermektir. Üç katmanda yapılır:

  1. Satır sayısı: Kaynakta kaç satır var, modelde kaç satır var? Bizim modelde Satislar tablosu 1.620 satır; SatirNo sütununda da 1.620 farklı değer var, yani yinelenen satır yok.
  2. Kontrol toplamları (control totals): Ham tutar toplamı, durumlara göre dağılım. Ham tutar 1.346.189,85 ₺; iptal 95.417,40 ₺; ikisinin farkı net satış 1.250.772,45 ₺.
  3. Dönem kırılımı: Toplam tutsa bile aylar kayabilir (saat dilimi, yanlış tarih sütunu). Yıl ve ay düzeyinde karşılaştır.
YılSatırHam tutarNet satış
2022105109.278,30 ₺102.837,20 ₺
2023550428.549,90 ₺400.869,55 ₺
2024965808.361,65 ₺747.065,70 ₺
Toplam1.6201.346.189,85 ₺1.250.772,45 ₺

Kaynak taraftaki karşılığını SQL ile alırsın (COUNT(*), SUM(Tutar), yıla göre GROUP BY); bunun için “Power BI analisti için SQL” dersine bak. Model tarafında aynı tabloyu DAX sorgu görünümünde (DAX query view) tek sorguyla üretirsin:

EVALUATE
ROW(
    "Satır", COUNTROWS(Satislar),
    "Tekil satır", DISTINCTCOUNT(Satislar[SatirNo]),
    "Ham tutar", SUM(Satislar[Tutar]),
    "İptal", CALCULATE(SUM(Satislar[Tutar]), Satislar[Durum] = "İptal"),
    "Net", [Net Satış]
)
Mutabakatı belgeye yazSonucu bir tabloyla sakla: “6 Ocak, kaynak: ERP satış dökümü, satır 1.620 = 1.620, ham tutar eşit, fark yok.” Bir sonraki “tutmuyor” sorusunda ilk bakacağın yer burasıdır.

Test sayfası ve DAX sorgu test paketi

Yazılımcılar kodlarını otomatik testlerle korur; ölçülerini sen de koruyabilirsin. Fikir: bilinen değerleri (brifteki ya da mutabakattaki sayılar) bir tabloya yaz, ölçülerin bugünkü sonucunu yanına koy ve farkı işaretle. Bir ölçüyü değiştirdikten sonra sorguyu tekrar çalıştırırsın; “FARK” görürsen bir şeyi bozmuşsundur.

EVALUATE
VAR Testler =
    DATATABLE(
        "Test", STRING, "Beklenen", DOUBLE,
        {
            { "Satır sayısı", 1620 },
            { "Net satış", 1250772.45 },
            { "Sipariş sayısı", 838 }
        }
    )
VAR Sonuc =
    ADDCOLUMNS(
        Testler,
        "Gerçek",
            SWITCH(
                [Test],
                "Satır sayısı", COUNTROWS(Satislar),
                "Net satış", [Net Satış],
                "Sipariş sayısı", [Sipariş Sayısı]
            )
    )
RETURN
    ADDCOLUMNS(Sonuc, "Durum", IF(ABS([Gerçek] - [Beklenen]) < 0.01, "OK", "FARK"))
Ondalık sayıları = ile karşılaştırmaNet satış motorda 1.250.772,4499999997 olarak hesaplanır; 1.250.772,45 ile = karşılaştırması “FARK” der. Para tutarlarını her zaman bir tolerans ile karşılaştır: ABS(Gerçek - Beklenen) < 0.01.

Aynı testleri raporda gizli bir Test sayfasına da koyabilirsin: her test için bir kart, kart değeri “OK” ya da “FARK” döndüren bir ölçü. Sayfa yayımlanan uygulamada gizlenir; geliştirici her yayından önce bakar.

Uç durumlar: testin asıl yeri

Ölçülerin çoğu ortalama durumda doğru çalışır. Hatalar kenarlarda saklanır. Bizim modelde her biri gerçek olan beş kenar:

Uç durumBu modeldeNe kontrol edersin?
Boş değer131 satırda KargoGun boş: 121’i iptal, 10’u aralık 2024’te hâlâ kargoda olan sipariş.Boşluk beklenen bir durum mu (henüz teslim edilmedi) yoksa veri hatası mı? Ortalama kargo günü boşları atlar; bunu tanıma yaz.
Eksik boyut bilgisi7 müşterinin şehri boş; bu müşterilerin net satışı 63.852,75 ₺.Şehir grafiğinde “(Boş)” çubuğu çıkar. Gizlemek yerine veri sahibine bildir.
Kısmi dönemSatışlar 22 Haziran 2022’de başlıyor; haziran 2022 net satışı yalnızca 595 ₺. Temmuz 2022’nin aylık büyümesi bu yüzden +%1.902,7 görünür. Hedefler ise ocak 2022’den başlıyor: ilk beş ayın 17.500 ₺ hedefi satışsız kaldığı için 2022 gerçekleşmesi %77,0.Büyüme ve hedef ölçülerini ilk ve son dönemde dene. Gerekirse kısmi dönemi rapordan dışla ya da not düş.
Sıfıra bölmeÖnceki ayı olmayan ilk ayda [MoM %] boş döner, çünkü DIVIDE kullanılıyor.Her oranda / yerine DIVIDE; “BLANK, hatalar ve DAX’ta hata ayıklama” dersine bak.
Toplam satırıKategori satırlarındaki sipariş sayılarının toplamı 1.377, toplam satırı 838. Kategorilerin ortalama sepetlerini toplasan 6.251,44 ₺ eder; gerçek ortalama sepet 1.492,57 ₺.Toplam satırı satırların toplamı olmak zorunda değildir: bir sipariş birden çok kategoride ürün içerebilir, ortalamalar toplanmaz. Kullanıcıya bunun hata olmadığını açıklayan bir not ekle.

Bunlara ek olarak her sayfayı filtrelerle dene: tek bir yıl, hiç verisi olmayan bir kategori ve kanal kombinasyonu, birden çok dilimleyici seçimi. Satır düzeyi güvenlik varsa “Rol olarak görüntüle” ile her rolü tek tek test et (“Satır ve nesne düzeyinde güvenlik” dersi).

Veri sözlüğü: her ölçünün kimliği

Veri sözlüğü (data dictionary), modeldeki her ölçünün ve önemli sütunun ne anlama geldiğini yazan tablodur. Raporu devralan kişinin ilk açtığı belgedir.

Ölçüİş tanımıBiçimSahipBilinen değer
Net Satışİptal olmayan satırların indirim sonrası tutarı. İadeler dahil.#.##0,00 ₺FinansTüm yıllar 1.250.772,45 ₺
Sipariş Sayısıİptal olmayan farklı sipariş numarası sayısı. Kategoriler toplanmaz.#.##0Satış838
MoM %Net satışın önceki aya göre değişimi. İlk ayda boş.%0,0SatışAralık 2024: %5,6

Tanımı modelin içine de yaz: Model görünümünde ölçüyü seçip Özellikler bölmesindeki Açıklama (Description) alanını doldurursan, kullanıcı Veri bölmesinde ölçünün üzerine geldiğinde bu metni görür. Sözlüğün ham hâlini DAX sorgu görünümünde INFO.VIEW.MEASURES() fonksiyonu verir: her ölçünün adı, tablosu, açıklaması, ifadesi ve biçim dizesi gelir. İfade sütununu yalnızca modelde yazma izni olanlar görür.

EVALUATE
SELECTCOLUMNS(
    INFO.VIEW.MEASURES(),
    "Ölçü", [Name],
    "Açıklama", [Description],
    "Biçim", [FormatString],
    "İfade", [Expression]
)

Sürüm notları

Her yayında kısa bir not yaz ve raporun “Hakkında” sayfasına ya da çalışma alanındaki bir belgeye ekle:

Örnek: Satış raporu v1.3 (14 Ocak)Eklendi: Dijital kanal satırı (Web + Mobil). Değişti: Ortalama kargo günü tanımı: kargodaki siparişler hesaba girmiyor. Düzeltildi: Şehir grafiğinde boş şehir “Bilinmiyor” olarak etiketlendi. Etkisi: Geçmiş net satış rakamları değişmedi. Testler: 3/3 OK.

Sürüm notunun en önemli satırı etkisidir: kullanıcı, dün indirdiği Excel’deki sayının neden bugün farklı olduğunu orada görür. Dosyaları PBIP biçiminde Git’te tutuyorsan, not commit mesajıyla birlikte geçmişe de yazılır (“Yaşam döngüsü: PBIP, TMDL, Git, dağıtım işlem hatları, şablonlar” dersi).

Kullanıcı kabul testi (UAT)

Kullanıcı kabul testi (user acceptance testing), raporu yapan değil kullanan kişinin, brifteki kabul kriterlerine göre “evet, bu iş görüyor” demesidir. Kriterleri brifte yazmıştın; burada testi yönetiyorsun:

  1. Test kişilerini seç: her rolden en az bir kullanıcı (müdür, bölge sorumlusu).
  2. Senaryo ver, tur verme: “Aralıkta hedefin altında kalan kategoriyi bul ve geçen yılla karşılaştır.” Kullanıcı kendisi yapsın.
  3. Bulguları tek listede topla: madde, kim buldu, önem (engelleyici / önemli / küçük), durum.
  4. Engelleyici yoksa onay al: e-postayla ya da iş takip aracında “Kabul edildi” durumu, tarih ve kişi.

Yayımlamadan önce kontrol listesi

Alıştırmalara geç (7)