Get certified for free when you join Fabric Data Days 2026 and dive into Fabric, Power BI, SQL, AI, and other essential data skills.
Join nowJuly 7 - July 17 | Round 2 of the Power BI Dataviz World Championships. Don't miss your chance! Learn more
Solved! Go to Solution.
Generally recursive calculations can be replicated non-recursively using a combination of cumulative measures, as measures and calculated columns can't self-reference.
See sample model here:
https://www.dropbox.com/s/9zqbq4gvhsg9bba/Circular%20reference%20calculation.pbix?dl=0
This is the output:
To produce this, let's suppose these are your two source tables:
'Initial Stock' table
Data table
Then this series of measures will produce your closing and opening stock by period:
Initial Stock Measure = SUM ( 'Initial Stock'[Intial Stock] ) // This measure should be constant over time and represents Stock at time zero Production Sum = SUM ( Data[Production] ) Market Sum = SUM ( Data[Market] ) Production Cumulative = CALCULATE ( [Production Sum], FILTER ( ALL ( Data[Time index] ), Data[Time index] <= MAX ( Data[Time index] ) ) ) Market Cumulative = CALCULATE ( [Market Sum], FILTER ( ALL ( Data[Time index] ), Data[Time index] <= MAX ( Data[Time index] ) ) ) Shortfall Cumulative = [Market Cumulative] - ( [Initial Stock Measure] + [Production Cumulative] ) Shortfall Cumulative Maximum So Far = MAX ( MAXX ( FILTER ( ALL ( Data[Time index] ), Data[Time index] <= MAX ( Data[Time index] ) ), [Shortfall Cumulative] ), 0 ) Closing Stock = [Initial Stock Measure] + [Production Cumulative] - [Market Cumulative] + [Shortfall Cumulative Maximum So Far] Opening Stock = CALCULATE ( [Closing Stock], FILTER ( ALL ( Data[Time index] ), Data[Time index] = MIN ( Data[Time index] ) - 1 ) )
Anyway, this is just an example to illustrate it can be done 🙂
Generally recursive calculations can be replicated non-recursively using a combination of cumulative measures, as measures and calculated columns can't self-reference.
See sample model here:
https://www.dropbox.com/s/9zqbq4gvhsg9bba/Circular%20reference%20calculation.pbix?dl=0
This is the output:
To produce this, let's suppose these are your two source tables:
'Initial Stock' table
Data table
Then this series of measures will produce your closing and opening stock by period:
Initial Stock Measure = SUM ( 'Initial Stock'[Intial Stock] ) // This measure should be constant over time and represents Stock at time zero Production Sum = SUM ( Data[Production] ) Market Sum = SUM ( Data[Market] ) Production Cumulative = CALCULATE ( [Production Sum], FILTER ( ALL ( Data[Time index] ), Data[Time index] <= MAX ( Data[Time index] ) ) ) Market Cumulative = CALCULATE ( [Market Sum], FILTER ( ALL ( Data[Time index] ), Data[Time index] <= MAX ( Data[Time index] ) ) ) Shortfall Cumulative = [Market Cumulative] - ( [Initial Stock Measure] + [Production Cumulative] ) Shortfall Cumulative Maximum So Far = MAX ( MAXX ( FILTER ( ALL ( Data[Time index] ), Data[Time index] <= MAX ( Data[Time index] ) ), [Shortfall Cumulative] ), 0 ) Closing Stock = [Initial Stock Measure] + [Production Cumulative] - [Market Cumulative] + [Shortfall Cumulative Maximum So Far] Opening Stock = CALCULATE ( [Closing Stock], FILTER ( ALL ( Data[Time index] ), Data[Time index] = MIN ( Data[Time index] ) - 1 ) )
Anyway, this is just an example to illustrate it can be done 🙂
Awesome approach !!
Great approach. However, I see that the "back order" are shortshipped, therefore some orders (market) are lost and we have 65 units at the end. What do we need to change in the formulas to allow stock to be shipped at a later date when available ? (therefore end with a zero closing stock). Tks
You should not write these as columns - use measures instead. Do you have some way to identify the order of the rows? E.g. A date? You will need this - power pivot is a database, not a spreadsheet and hence there's is no Implied order of the rows.
Join us in Barcelona for FabCon and SQLCon, the Fabric, Power BI, SQL, and AI community event. Save €200 with code FABCMTY200.
Join Fabric Data Days 2026: 60 days of free live/on-demand sessions, challenges, study groups, and certification opportunities.
| User | Count |
|---|---|
| 23 | |
| 19 | |
| 18 | |
| 17 | |
| 13 |
| User | Count |
|---|---|
| 60 | |
| 52 | |
| 47 | |
| 40 | |
| 38 |