अवलोकन
यह पावरबैंक को करने के लिए कहने के लिए एक चुनौतीपूर्ण बात है, इसलिए एक कठिन दृष्टिकोण को ढूंढना मुश्किल हो सकता है।
सबसे बड़ा मुद्दा यह है कि पावरबीआई का डेटा मॉडल एक रनिंग टैली की अवधारणा का समर्थन नहीं करता है - कम से कम जिस तरह से हम इसे एक्सेल में करते हैं। एक्सेल में, एक कॉलम मानों को संदर्भित कर सकता है जो उसी कॉलम की 'पिछली पंक्ति' में होता है और फिर एक अलग कॉलम में सूचीबद्ध कुछ 'दैनिक परिवर्तन' द्वारा समायोजित किया जाता है।
PowerBI केवल कुछ उप-पंक्तियों में सभी दैनिक परिवर्तनों को जोड़कर इसका अनुकरण कर सकता है। हम अपनी वर्तमान पंक्ति में दिनांक मान लेते हैं और एक फ़िल्टर की गई तालिका बनाते हैं, जहां सभी तिथियां इस वर्तमान पंक्ति की तारीख से कम होती हैं, और फिर उस सबसेट से सभी दैनिक परिवर्तनों को जोड़ते हैं। यह एक सूक्ष्म अंतर प्रतीत हो सकता है, लेकिन यह काफी महत्वपूर्ण है:
इसका मतलब यह है कि हमारे चलने वाले कुल को 'ओवरराइड' करने का कोई तरीका नहीं है। केवल जो गणित किया जा रहा है वह दैनिक परिवर्तन वाले कॉलम पर हो रहा है - 'कुल चलने' वाला कॉलम केवल एक परिणाम है - इसका उपयोग किसी भी बाद की पंक्ति की गणना में नहीं किया जाता है।
हमें 'रीसेट' की अवधारणा को छोड़ना चाहिए और इसके बजाय एक कॉलम बनाने की कल्पना करनी चाहिए जिसमें 'समायोजन' का मूल्य हो। हमारा समायोजन एक मूल्य होगा जिसे शामिल किया जा सकता है ताकि जब वर्णित शर्तों को पूरा किया जाए, तो दैनिक शेष और समायोजन की कुल राशि 1 हो जाएगी।
यदि हम ओपी द्वारा दी गई गणना को देखते हैं, तो हम देखते हैं कि 'गैर-कामकाजी' दिन पर हमारे चलने का कुल मूल्य एक 'काम करने वाले' दिन से पहले हमें देता है कि आवश्यक राशि, जो उलट होने पर शून्य के बराबर होगी। एक के बाद एक बढ़ाने के लिए प्रत्येक कार्य दिवस पर चल रहे कुल का कारण। यह हमारा वांछित व्यवहार है (बाद में वर्णित एक समस्या के साथ)।
परिणाम
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"
))
यह पंक्ति और फ़िल्टर संदर्भों के बीच अंतर जानने में मदद करता है और इस गणना का पालन करने के लिए EARLIER कैसे संचालित होता है। इस परिदृश्य में, आप "EARLIER" के बारे में सोच सकते हैं, जिसका अर्थ है "यह संदर्भ वर्तमान पंक्ति में मान को इंगित करता है" और अन्यथा "ALLEXCEPT (छोड़ें, छोड़ दें [Id])" द्वारा लौटाए गए संपूर्ण तालिका के संदर्भ बिंदु। जिस तरह से, हम उन स्थानों को खोजते हैं जहाँ वर्तमान पंक्ति में "कार्य" है और पूर्व दिवस की पंक्ति में कुछ अन्य प्रकार हैं।
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])
))
यह गणना एक 'फिल डाउन' प्रकार के ऑपरेशन का अनुकरण करती है। यह कहता है, "जब उन सभी पंक्तियों को देख रहे हैं जिनकी तारीख THIS पंक्ति की तारीख से पहले है, तो 'सबसे हाल की तारीख से पहले कार्य करने के लिए सबसे बड़ा मूल्य लौटाएं।"
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])
))
अब जबकि हर पंक्ति में एक फ़ील्ड है, जिसमें बताया गया है कि हमारे समायोजन के रूप में उपयोग करने के लिए दैनिक बैलेंस खोजने के लिए, हम टेबल से इसे देख सकते हैं।
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
और अंत में हम अंतिम परिणाम के लिए हमारे चलने वाले कुल में समायोजन लागू करते हैं।
समस्या
यह दृष्टिकोण यह पता लगाने में विफल रहता है कि गिनती को तब तक रीसेट नहीं किया जाना चाहिए जब तक कि चलने वाला दैनिक संतुलन शून्य से नीचे न हो। मुझे पहले गलत साबित किया गया है, लेकिन मैं कहूंगा कि यह केवल DAX में पूरा नहीं किया जा सकता क्योंकि यह एक परिपत्र निर्भरता बनाता है। अनिवार्य रूप से, आप एक आवश्यकता बनाते हैं: एकत्रीकरण में क्या शामिल होना चाहिए यह निर्धारित करने के लिए एकत्रित मूल्य का उपयोग करें।
इसलिए जब तक मैं आपको ला सकता हूं। आशा है ये मदद करेगा।