Forum Discussion
Strange CLOSINGBALANCE behaviour
- 9 months ago
Hi MBZA,
Thats weird behavior but it seems like in your first version
BTD with MTD Amount test = VAR res = CALCULATE( SUMX('Financial Data', VAR amt = 'Financial Data'[BTD with MTD Amount lower] + 1000 * 'Financial Data'[BTD with MTD Amount upper] RETURN amt )) RETURN CLOSINGBALANCEMONTH(res, 'Fiscal Period'[Fiscal Month])that the variable res is evaluated first in the current filter context (which is at quarter level includes all months in quarter) then CLOSINGBALANCEMONTH operates on that already aggregated value
And in your second version (working solution you provided)
BTD with MTD Amount test = CLOSINGBALANCEMONTH(CALCULATE(SUMX('Financial Data', 'Financial Data'[BTD with MTD Amount lower] + 1000 * 'Financial Data'[BTD with MTD Amount upper])), 'Fiscal Period'[Fiscal Month])that he entire expression is evaluated inside the CLOSINGBALANCEMONTH function (so it can properly apply the end of month context)
So here is some Approach you can try (I hope it works):- Use a measure reference
BTD with MTD Amount test = VAR BaseMeasure = [Your Base Measure] // Reference another measure RETURN CLOSINGBALANCEMONTH(BaseMeasure, 'Fiscal Period'[Fiscal Month])- Put the all calculation in CALCULATE
BTD with MTD Amount test = VAR complexCalculation = SUMX('Financial Data', // Your complex logic here ) RETURN CLOSINGBALANCEMONTH(CALCULATE(complexCalculation), 'Fiscal Period'[Fiscal Month])Use iterator functions
BTD with MTD Amount test = SUMX( VALUES('Fiscal Period'[Fiscal Month]), CLOSINGBALANCEMONTH( CALCULATE( SUMX('Financial Data', // Your complex logic ) ), 'Fiscal Period'[Fiscal Month] ) )
So the idea here is that time intelligence functions need to control the filter context themselves (they cant work properly on pre-calculated results)if this post helps, then I would appreciate a thumbs up and mark it as the solution to help the other members find it more quickly.
Hi MBZA
Your two DAX versions behave differently because the VAR forces the SUMX to evaluate in the current filter context.
So at quarter level, the VAR already holds the sum of all months, and CLOSINGBALANCEMONTH can only return that (300).
When you put the SUMX inside CLOSINGBALANCEMONTH, the expression gets evaluated per month, inside the time-intelligence context. That’s why the quarter correctly returns 100 — the last month’s value.
So the root cause is:
A VAR freezes the value too early → breaks time-intelligence.
Inline evaluation lets CLOSINGBALANCEMONTH do its job.
BTD with MTD Amount Test =
VAR Expr =
SUMX(
'Financial Data',
'Financial Data'[BTD with MTD Amount lower] +
1000 * 'Financial Data'[BTD with MTD Amount upper]
)
RETURN
CLOSINGBALANCEMONTH(
CALCULATE(Expr),
'Fiscal Period'[Fiscal Month]
)
This should work, please use this.