Dimensional expressions
How to select elements of a dimension in an Axmo formula — names, paths, positions, offsets, ranges and set operations.
A dimensional expression answers one question: which elements of a dimension do you mean?
It appears inside the square brackets of a series reference — Revenue[Italy], Revenue[Month[-1]] — and
in the row and column definitions of an Output Range. Wherever you need to point at part of a dimension,
this is the notation you point with.
A dimensional expression never computes a value. It only says where to look.
Everything below composes: a path can contain a position, a position can sit inside a set operation, and a set operation can feed a path. There is one notation, not seven.
Names
The ordinary way to name something is to write it.
Revenue[Italy] an element
Revenue[Month] a layer — every element in it
Revenue[Geography/Italy] the element, with its dimension named
Names are case-insensitive: italy, Italy and ITALY are the same element. Spaces, hyphens and digits
are ordinary characters in a name, so Revenue[Ship Types] and Revenue[Fiscal 2025] are written exactly
like that.
You only need to qualify a name when it would otherwise be ambiguous, and most of the time it is not. A
filter is read against the dimensions the series is connected to, so a name that also exists somewhere the
series does not reach raises no question at all: Revenue[Total] is settled the moment only one of
Revenue's own dimensions holds an element called Total.
Ambiguity is the narrower case — two of the series' own dimensions holding the same name. Then Axmo cannot
settle it, says so, and Revenue[Version/Total] is how you answer. Axmo never guesses which one you meant.
A dimension name on its own is not a selection. Revenue[Time] is an error, because a dimension is not
a set of elements until you say which ones — its top level, its leaves, or a named layer. The error message
names the fix.
Nearly every name is written plainly, exactly as it appears in the editor. The exception is a name carrying
a character the plain form cannot hold — a comma, a bracket, an apostrophe, an accent:
Profit Contribution, %, O'Brien Fleet, Café Nord. Those are written inside square brackets:
Revenue[[Café Nord]] an element whose name carries an accent
[Profit Contribution, %] a series whose name carries punctuation
One name, two spellings. You will reach for the second rarely — and wherever a plain name can go, the bracketed one can go too.
Paths
A slash narrows: each segment is read inside the scope the segment before it produced.
Revenue[Geography/Europe/Italy] Italy, reached through Europe
Revenue[2026/Month] the months of 2026
Revenue[Europe/Country] the countries of Europe
Three suffixes end a path by expanding what it reached:
Revenue[2026/_] the leaves beneath 2026 — however many levels down they are
Revenue[Europe/*] the direct children of Europe — one level, no further
Revenue[Europe/City] every element of the City layer beneath Europe
_ reaches the bottom whatever the depth. * goes down exactly one level. A layer name goes to that layer,
however far down it is.
A trailing slash on its own does not expand anything. Revenue[Europe/] is Europe alone, not its
descendants — the slash navigates, and with nothing after it there is nowhere further to go. To reach what
is beneath an element, write Europe/_ or Europe/*.
Positions, offsets and ranges
Counting from a fixed point
A $ counts within the scope the path has reached, starting at 1. Negative numbers count back from the
end.
Revenue[Month[$1]] the first month
Revenue[Month[$-1]] the last month
Revenue[2026/Month[$1]] January 2026 — the first month of 2026, not of the model
These are fixed. Month[$1] selects the same element wherever the formula is evaluated.
Positions count every member of a layer, and where a dimension declares a boundary element, that element is
a member — so $1 may not be the month you expect. See Boundary elements below.
Counting from where you are
Without the $, the number is an offset from the coordinate the formula is currently being evaluated at.
Revenue[Month[-1]] the previous month
Revenue[Month[+1]] the next month
Revenue[Month[0]] the current month — the same as writing Revenue
This is the distinction Excel draws with $A$1 and A1: one stays put, the other moves with the formula.
An offset is taken in the layer you name, and the layer you name is the one you get. From a monthly
coordinate, Year[-1] is last year's total, not the same month a year ago — it steps back one year,
and a year is an aggregate of its months. The same month of the previous year is twelve months back:
Revenue[Year[-1]] last year's total — the same number in every month of this year
Revenue[Month[-12]] the same month, last year
Both are correct and they mean different things. Which one you want depends on what you are comparing.
Ranges
A colon takes everything between two endpoints, inclusive.
Revenue[Month[$1:$3]] the first three months
Revenue[Month[-2:0]] this month and the two before it
Revenue[2026-Q1:2026-Q3] Q1 through Q3, by name
SUM(Revenue[Shoes:Socks]) every product from Shoes through Socks, inclusive
Revenue[Month[$1:0]] from the first month of the model to this one
Revenue[Europe/Italy:Europe/Spain] Italy through Spain, each named through Europe
Endpoints are independent — each is written exactly as you would write it on its own. One may be fixed and the other relative; either may be qualified by a path.
A range that runs past the end of a dimension is shortened, not rejected — ask for the last six months
in a model that has four and you get four. This is different from an offset that lands outside the
dimension, which produces no value at all: Revenue[Month[-1]] in the very first month has no previous
month to read.
Where you are, and what is above you
Four operators navigate from the coordinate the formula is being evaluated at, rather than from a name.
.. the parent of the current element
~ the top of the tree the current element belongs to
* the children of whatever the path has reached
_ the leaves beneath whatever the path has reached
.. and ~ walk up; * and _ expand down. .. also works part-way along a path, so
Revenue[2026-03/..] is the quarter that March belongs to.
Revenue[..] the aggregate this element rolls up into
Revenue[~] the total for the whole dimension
Set operations
Three operators combine selections. All three work within a single dimension — combining elements of two different dimensions is an error, because the result would not be a selection of anything in particular.
Revenue[Italy | France | Germany] union — any of these
Revenue[Europe/_ & Coastal] intersection — in both
Revenue[Month \ 2026-01] difference — all months except January
Combining with paths
A slash binds tighter than both a range colon and a set operation, so brackets say which you mean:
Revenue[(2026-Q1 | 2026-Q3)/Month] the months of Q1 and of Q3
Revenue[(2026-Q1:2026-Q3)/Month] the months of Q1 through Q3
Without the brackets, the slash would bind to 2026-Q3 alone and the union would be taken afterwards,
which is a different set.
One element or many
This distinction decides what you can do with the result.
A selection that lands on one element gives one number, and behaves like any other value:
Profit = Revenue[Italy] - Cost[Italy]
A selection that lands on several gives one number per element, and arithmetic has nothing to work on until you reduce it:
SUM(Revenue[Month[$1:$3]]) the total of the first three months
AVG(Revenue[Europe/_]) the average across Europe's leaves
Revenue[Month[$1:$3]] * 2 an error — several values, one multiplication
Axmo will not silently add up several values because one was expected. If you meant the total, SUM says
so and the model reads as what it does.
Position within a hierarchy
@ gives the position of the current element as a number, which is what makes a formula able to behave
differently at the start of a period or in a particular quarter.
Month@Year which month of the year this is — 1 to 12
Quarter@Year which quarter of the year — 1 to 4
Month@ which month this is overall, counting from the start of the dimension
@Time the position of the current coordinate within its own level
DimPosition is the same thing in function form, and takes an expression rather than the current element.
DimLevel returns how deep in the hierarchy an element sits, counting the top as 1 — useful when a
calculation should differ at one level of a hierarchy from another.
The names on either side of @ are written plainly, spaces and all — Ship Types@Group asks the same
question of a two-word layer as Month@Year does of a one-word one. Where a name needs the bracketed
spelling, that works here too: [Ship Types]@Group. And DimPosition says the same thing in longer form —
Month@Year spelled out is DimPosition(Month[0], Year[0]).
Boundary elements
A sequential dimension can carry a boundary element at each end — BEFORE, sitting ahead of the first
period, where an opening balance is entered, and AFTER, sitting past the last, where a residual value is
parked. They sit outside the hierarchy deliberately: nothing rolls them up into a total, because an
opening balance added to the year would count once too often.
Whether a selection reaches them is a question of scope, and only that. A selection made across a whole layer includes them; one that travels through the tree does not.
Revenue[Month] includes the boundary element — it is a member of the layer
Revenue[2026/Month] does not — nothing outside the hierarchy is beneath 2026
The consequence worth knowing before it surprises you: adding a boundary element shifts every fixed
position in a layer-wide selection by one. Month[$1] was January; with a BEFORE element declared, it
is that element. ISBEFORE and ISAFTER are how a formula asks whether it is standing on one, rather than
counting to find out.