Dataseries
A dataseries is a named set of values — revenue, headcount, a closing balance — spread across the dimensions you connect it to. Some you fill in; the rest are computed by a formula from the ones you did.
In a spreadsheet, a number's identity is its address. Sheet2!D14 is the only name it has, and every formula that uses it is really a statement about geography — which is why inserting a row can quietly change what a model means.
In Axmo a number belongs to a named dataseries and a coordinate. Revenue for Italy in March is exactly that: the Revenue series, at the coordinate Italy × March. Nothing about it depends on where it happens to be printed.
What a dataseries is
A dataseries is a named set of values spread across the dimensions it is connected to. You choose those connections when you create it: a series can be connected to none of the model's dimensions, one, or all of them.
- Headcount connected to Country and Month is a value for every country in every month.
- Corporation tax rate connected to nothing at all is a single figure the whole model can refer to.
Series are usually described as a cube — one per series, with its dimensions as the edges — and that picture is accurate, but the simpler one is just as true: a series is a name, and under that name a value at each coordinate.
Two kinds, and only two
Input series hold values you supply — typed on the worksheet, or read from a range Axmo is pointed at. An input series has no formula, and the model will not let you attach one.
Calculated series hold values produced by a formula that refers to other series. You cannot type over a calculated value, and the model will not let you try.
There is no third kind, and the strictness is the point. A cell you can both compute and overtype is where spreadsheet models quietly go wrong: the override survives, the formula that explained it does not, and six months later nobody can tell which numbers were reasoned and which were pasted. Here, every value either came from outside the model or is explained by a formula you can read.
A formula is written once
You write the relationship, not the arithmetic for each cell:
Profit = Revenue - Total Cost That is the whole definition. It is evaluated at every coordinate the series covers — Italy in March, Germany in April, and so on — and at each one, Revenue and Total Cost are read at the same coordinate as the Profit being computed. Add a country next year and the formula does not change. Add a whole dimension and it still does not change.
Where you need a different coordinate, you say so. Revenue[2026] is revenue for a fixed year; Balance[Month[-1]] is the balance one month back. This is what makes a roll-forward writable as a single line — see Recurrence.
Every name is checked before anything runs
Series, dimensions, layers, elements, functions — every name a formula mentions must exist when the model compiles. A misspelled series name is a hard error that names what it could not find and lists what is available. It is never a warning, and never silently treated as empty.
This is deliberate, and it is the opposite of what a spreadsheet does with a reference that has stopped meaning anything. The cost is that you cannot write a formula against a series you have not created yet. The benefit is that a model which compiles has no dangling references anywhere in it.
Empty, zero and null
A coordinate of an input series that you never filled in is zero. The model computes densely: every leaf coordinate has a value.
Null is a different thing and arises from specific events — a reference that points off the end of a layer, or a division by zero. Null spreads: anything arithmetic done with a null is null. Where you want a fallback instead, Nz(expression, 0) supplies one.
Keeping the two apart matters. Zero is an answer. Null means there was no answer to be had, and the model says so rather than guessing.
Each series chooses its own totals
Every series connected to a dimension carries its own rule for combining values up that dimension's tree — and a series in three dimensions carries three independent rules.
Sum, average, weighted average, first, last, minimum, maximum, or a formula evaluated at each total rather than derived from the children. A series can also decline to total on a dimension at all.
Two examples over the same Time dimension, in one model:
- Revenue sums. A year is its twelve months added up.
- Closing balance takes the last. A year's closing balance is December's, and summing twelve of them would be meaningless.
For ratios, the formula option is usually what you want. A margin of Profit / Revenue re-evaluated at the quarter — using the quarter's own already-totalled profit and revenue — gives the correct quarterly margin. Adding up three monthly margins would not.
Actuals and forecast are not two models
The familiar spreadsheet answer is a second set of tabs, or a second workbook. In Axmo it is an ordinary categorical dimension — call it Version, with elements Actual, Forecast and Budget — connected to the series that need it.
One model, one set of formulas, evaluated for each version. Comparing plan against fact becomes an ordinary formula over that dimension rather than a reconciliation exercise between two files.
Next
Dimensions covers the structure a series is spread over. Recurrence covers the case where a series refers to its own earlier values. Dataseries expressions covers how to write the formula of a calculated series — references, filters, arithmetic, aggregation, conditions and missing values. Supported functions covers every function available in a formula — logical, arithmetic, aggregation, financial and dimension navigation.