genel bakış
Bu, PowerBI'den yapmasını istemek zor bir şeydir, bu nedenle düzenli bir yaklaşım bulmak zor olabilir.
En büyük sorun, PowerBI'nin veri modelinin çalışan bir çetele kavramını desteklememesi - en azından Excel'de yaptığımız gibi değil. Excel'de bir sütun, aynı sütunun 'önceki satırında' ortaya çıkan değerlere başvurabilir ve ardından farklı bir sütunda listelenen bazı 'günlük değişiklikler' ile ayarlanabilir.
PowerBI bunu ancak bazı satır alt kümelerine tüm günlük değişiklikleri toplayarak taklit edebilir. Geçerli satırımızdaki tarih değerini alır ve tüm tarihlerin bu geçerli satırın tarihinden daha az olduğu filtrelenmiş bir tablo oluştururuz ve ardından bu alt kümedeki tüm günlük değişiklikleri toplarız. Bu ince bir fark gibi görünebilir, ancak oldukça önemlidir:
Bu, çalışan toplamımızı 'geçersiz kılmanın' hiçbir yolu olmadığı anlamına gelir. Yapılan tek matematik günlük değişiklikleri içeren sütunda gerçekleşiyor - 'toplam çalışan' içeren sütun sadece bir sonuçtur - daha sonraki satırların hesaplamasında asla kullanılmaz.
'Sıfırlama' kavramından vazgeçmeli ve bunun yerine 'ayar' değeri içeren bir sütun oluşturmayı hayal etmeliyiz. Düzenlememiz, açıklanan koşullar karşılandığında günlük bakiyeler ve düzenlemelerin toplamı 1 olacak şekilde eklenebilecek bir değer olacaktır.
OP tarafından verilen hesaplanan koşuya bakarsak, bir 'çalışma' gününden hemen önce 'çalışmayan' bir günde koşu toplamımızın değerinin bize, eğer tersine çevrilirse, sıfıra ve takip eden her iş gününde toplamın birer birer artmasına neden olur. Bu bizim arzulanan davranışımızdır (daha sonra açıklanacak bir problem ile).
Sonuç
Most Recent Date Prior to Work =
CALCULATE(
Max(Leave[Date]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Date]) -1 && Leave[Type] <> "Working" && Earlier(Leave[Type]) = "Working"
))
Satır ve filtre bağlamları arasındaki farkı ve EARLIER'ın bu hesaplamayı takip etmek için nasıl çalıştığını bilmeye yardımcı olur. Bu senaryoda, "EARLIER" anlamını "bu referans geçerli satırdaki değere işaret eder" ve aksi takdirde "ALLEXCEPT (Ayrıl, Bırak [Id])" ile döndürülen tüm tabloya işaret eder. mevcut satırın "Çalışıyor" ve önceki günün satırının başka bir türü olduğu yerleri buluruz.
Most Recent Date Prior to Work Complete =
CALCULATE(
Max(Leave[Most Recent Date Prior to Work]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] <= EARLIER(Leave[Date])
))
Bu hesaplama 'doldurma' türünde bir işlemi taklit eder. "Tarihi BU satırdaki tarihten önce olan tüm satırlara bakarken," Çalışmadan Önce En Son Tarih "deki en büyük değeri döndürün.
Daily Balance Adjustment =
CALCULATE(
SUM(Leave[Running Daily Balance]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Most Recent Date Prior to Work Complete])
))
Artık her satırın, ayarlamalarımız olarak kullanmak için günlük dengeyi nerede bulacağınızı açıklayan bir alanı olduğundan, tablodan bakabiliriz.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
Son olarak ayarlamayı nihai sonuç için koşu toplamımıza uygularız.
Sorun
Bu yaklaşım, çalışan günlük bakiye sıfırın altında olmadığı sürece sayımın sıfırlanmaması gerektiğini belirtmez. Daha önce yanlış olduğumu kanıtladım, ancak bunun sadece DAX'ta gerçekleştirilemeyeceğini söyleyebilirim çünkü dairesel bir bağımlılık yaratır. Temel olarak, bir gereksinim yaparsınız: toplamaya neyin dahil edilmesi gerektiğini belirlemek için toplanmış değeri kullanın.
Bu yüzden size getirebildiğim kadarıyla. Umarım yardımcı olur.