Gambaran
Ini adalah hal yang menantang untuk diminta PowerBI lakukan, sehingga pendekatan yang rapi mungkin sulit ditemukan.
Masalah terbesar adalah bahwa model data PowerBI tidak mendukung konsep penghitungan berjalan - setidaknya bukan cara kita melakukannya di Excel. Di Excel, sebuah kolom bisa mereferensikan nilai yang terjadi di 'baris sebelumnya' pada kolom yang sama dan kemudian disesuaikan dengan beberapa 'perubahan harian' yang terdaftar di kolom yang berbeda.
PowerBI hanya bisa meniru ini dengan menambahkan semua perubahan harian pada beberapa bagian baris. Kami mengambil nilai tanggal di baris kami saat ini dan membuat tabel yang difilter di mana semua tanggal kurang dari tanggal baris ini, dan kemudian menjumlahkan semua perubahan harian dari subset tersebut. Ini mungkin tampak perbedaan yang halus, tetapi cukup signifikan:
Ini berarti bahwa tidak ada cara untuk 'mengganti' total lari kami. Satu-satunya matematika yang sedang dilakukan adalah terjadi pada kolom yang berisi perubahan harian - kolom yang berisi 'total berjalan' hanyalah hasil - itu tidak pernah digunakan dalam perhitungan baris berikutnya.
Kita harus meninggalkan konsep 'reset' dan malah membayangkan membuat kolom yang berisi nilai 'penyesuaian'. Penyesuaian kami akan menjadi nilai yang dapat dimasukkan sehingga ketika kondisi yang dijelaskan dipenuhi, total saldo dan penyesuaian harian akan berjumlah 1.
Jika kita melihat running yang dihitung yang diberikan oleh OP, kita melihat bahwa nilai total running kita pada hari 'non-kerja' tepat sebelum hari 'bekerja' memberi kita jumlah yang dibutuhkan itu, jika dibalik, akan berjumlah nol dan menyebabkan total berjalan pada setiap hari kerja berikutnya bertambah satu. Ini adalah perilaku yang kita inginkan (dengan satu masalah yang akan dijelaskan nanti).
Hasil
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"
))
Ini membantu untuk mengetahui perbedaan antara konteks baris dan filter dan bagaimana EARLIER beroperasi untuk mengikuti perhitungan ini. Dalam skenario ini, Anda dapat menganggap "EARLIER" sebagai yang berarti 'referensi ini menunjuk ke nilai di baris saat ini "dan sebaliknya sebuah referensi menunjuk ke seluruh tabel yang dikembalikan oleh" ALLEXCEPT (Leave, Leave [Id]). " cara, kami menemukan tempat-tempat di mana baris saat ini memiliki tipe "Bekerja" dan baris hari sebelumnya memiliki beberapa jenis lainnya.
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])
))
Perhitungan ini meniru jenis operasi 'isi'. Dikatakan, "Ketika melihat semua baris yang tanggalnya sebelum tanggal pada baris INI, kembalikan nilai terbesar dalam 'Tanggal Terbaru Sebelum Bekerja."
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])
))
Sekarang setiap baris memiliki bidang yang menjelaskan ke mana harus mencari saldo harian untuk digunakan sebagai penyesuaian kami, kita bisa mencarinya dari tabel.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
Dan akhirnya kami menerapkan penyesuaian pada total berjalan kami untuk hasil akhir.
Masalah
Pendekatan ini gagal menunjukkan bahwa penghitungan tidak boleh direset kecuali saldo harian berjalan di bawah nol. Saya telah terbukti salah sebelumnya, tetapi saya akan mengatakan bahwa ini tidak dapat diselesaikan dalam DAX saja karena itu menciptakan ketergantungan melingkar. Pada dasarnya, Anda membuat persyaratan: gunakan nilai agregat untuk menentukan apa yang harus dimasukkan dalam agregasi.
Jadi sejauh yang bisa saya bawa. Semoga ini bisa membantu.