Table
Table manifests describe tables bound to datasets.
They control formatting, grouping, scenarios, and optional drilldown views.
Minimal definition
Section titled “Minimal definition”The smallest well-formed Table sets the required spec.dataset plus the fields
that turn it into an IBCS table: the scenario columns, at least one variance
column, and row grouping. measureType and measureUnit label the numbers so
the reader knows what they mean.
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_table
spec:
dataset: revenue_by_segment
scenarios: ["ac1", "pp1"]
variances: ["dac1_pp1_pos", "drac1_pp1_pos"]
grouped: true
measureType: currency
measureUnit: "EUR"All attributes are listed in the Attribute Reference below.
dataset accepts the dataset name shown above, an inline DataSet
definition, or an array of both. scenarios, variances, order, and
orderDirection can also be taken from the surrounding layout instead of being
repeated here (see Inherited props).
Fields
Section titled “Fields”dataset– required dataset reference: a name, an inlineDataSetdefinition, or an array of those.filter– optional filter expression.order– sort key; using scenario names requires them to appear inscenarios. Default:category.orderDirection– sort direction (ascordesc).measureScale,measureType,measureUnit– control how measures are interpreted and displayed.categoryWidth– width of the category column (w5..w50,inf).dataFormat,dataFormatDigitsDecimal,dataFormatDigitsPercent– number formatting.grouped,showGroupTitle– group rows byrowgroupand optionally show group headers.showMeasureScale– toggle measure unit in table header.limit– maximum rows per group; extra rows are cumulated as REST.type– table type (list,sum,opt,sumnototal,optnototal). Onlysumandoptrender a grand-total row at the bottom of the table.sumTitle– label of that grand-total row. It is not a title above the table: it is the text in the category cell of the total row. Since the other table types render no total row, they ignore the value. When empty, the row is labelled with the IBCS grand-total symbol ❖.scenarios– list of scenario measures, orauto. When set toauto, scenarios are detected from the dataset silently. When left blank (and variances are also blank), they are detected with a warning.variances– list of variance definitions of the formd<scenarioB>_<scenarioA>_[pos|neg|neu].barColumns– list of column names to render as inline IBCS-compliant bar charts instead of numbers.barColumnWidth– maximum width of inline bar/pin chart columns in em (w5..w100). Default:w10.unitScaling– data units displayed per 1 em of bar length for absolute variance bars (d_ prefix columns) — map-scale semantics: a larger value means smaller bars. Also acceptsauto(fit the largest bar to the bar column) or a ScalingGroup name. Default: 100.percentageScaling– percentage points displayed per 1 em of pin length for relative variance pins (dr_ prefix columns);2means a +2 % pin is 1 em long. Also acceptsautoor a scaling group name. Default: 2.scale– proportional scaling of the entire table (font size, em-based spacing, SVG bar charts, pins, patterns). All visual dimensions scale together.- not set – auto-scale to fit the parent width; emits an
AUTO_scalewarning with the applied factor. (An empty string""is rejected by the schema.) "none"– no scaling; render at the base font size regardless of available space."auto"– auto-scale to fit the parent width silently (no warning).- A positive number (
"0.5","1.2", …) – fixed factor applied to the base font size.
- not set – auto-scale to fit the parent width; emits an
thereof,partof,columnthereof– drilldown configuration.interval– repeats the entire scenario/variance column block once per interval group, rendered under a spanning header band. Values:none(default),setname, or a date granularity (year,quarter,month,week,day,hour,minute,second,millisecond,auto). Mutually exclusive withcolumnthereof(columnthereofwins). See Interval column grouping.attributes– computed attribute columns rendered between the category and scenario columns; ordered list of{label, expression}pairs. See Computed attribute columns.i18nNamespace– optional namespace consulted for this component's labels; missing keys fall back to_system. When unset, it is resolved from the nearest ancestor carrying one.selectedStyle– optional name of aComponentStyleto apply; merged over the_systemand_defaultstyles.ruleset– optional name of aRuleSetto apply, orinherited-closest/inherited-pageto inherit the surrounding layout's rule set; merged over the_systemand_defaultrule sets.
Example: Grouped table with drilldown
Section titled “Example: Grouped table with drilldown”---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_grouped_table
spec:
dataset: revenue_detail
measureScale: M
measureType: currency
measureUnit: "EUR"
grouped: true
showGroupTitle: true
categoryWidth: w25
type: list
limit: 5
scenarios: ["ac1", "pp1"]
variances: ["dac1_pp1_pos"]
thereof:
- rowGroup: "Revenue"
category: "Applications"
subCategory: "Applications-A"
partof:
- rowGroup: "Revenue"
category: "Applications"
columnthereof:
- scenario: "ac1"
name: "DE"
subGroups: ["Berlin", "Hamburg"]Computed attribute columns
Section titled “Computed attribute columns”attributes adds custom columns computed from dataset fields, rendered between
the category column and the scenario columns. Each entry maps a column header
label to an aggregate expression evaluated over the dataset rows behind each
table row:
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_with_attributes
spec:
dataset: revenue_by_region
scenarios: ["ac1", "pp1"]
grouped: true
type: sum
attributes:
- label: "Verkaufsleiter"
expression: "set(_leiter)"
- label: "Umsatz gesamt"
expression: "sum(ac1)"The list order defines the column order. Alternatively, a raw JSON object string can be used; its key order defines the column order:
attributes: '{"Verkaufsleiter": "set(_leiter)", "Umsatz gesamt": "sum(ac1)"}'Expression functions
Section titled “Expression functions”| Function | Result |
|---|---|
set(field) | All distinct values in the group, joined with ", ". |
first(field) | Value of the first row in the group. |
last(field) | Value of the last row in the group. |
min(field), max(field) | Numeric minimum/maximum. |
avg(field), sum(field) | Numeric average/sum; respects the row operation sign. |
lit(value) | Constant value rendered in every row. |
Notes:
- Field arguments must be plain identifiers (
[A-Za-z_][A-Za-z0-9_]*): standard dataset fields (e.g.ac1) or custom fields prefixed with_(e.g._leiter). Custom fields pass through datasources and datasets as extra row columns.litaccepts any non-empty constant. - Results of
min,max,avg, andsumare formatted like scenario cells (measure scale and decimal digits); other functions render as-is. - Cells stay blank on total and group-header rows (SUM, GROUP_SUM, GROUPHEAD,
REST, PARTELEMENT). On
thereofdrill rows, aggregates are computed over the drilled subset. - Invalid entries are ignored and produce a component warning. Duplicate labels collapse (the last one wins).
- Requires template engine
v1.0.0-alpha.15or newer; older engines silently ignore the attribute.
Inline bar chart columns
Section titled “Inline bar chart columns”Render variance and scenario columns as inline IBCS-compliant bar charts using barColumns:
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_with_bars
spec:
dataset: revenue_by_segment
measureScale: M
measureUnit: "EUR"
scenarios: ["ac1", "pp1"]
variances: ["dac1_pp1_pos", "drac1_pp1_pos"]
barColumns: ["dac1_pp1_pos", "drac1_pp1_pos"]
unitScaling: 50
percentageScaling: 1Bar chart types
Section titled “Bar chart types”| Column prefix | Visualization | Description |
|---|---|---|
d_ (absolute variance) | Horizontal bar | Bar extends left (negative) or right (positive) from center axis. Green for positive-good, red for negative-bad. |
dr_ (relative variance) | Pin/dot chart | Thin colored line from axis with dot at end. Arrow for extreme values (>100%). Italic percentage label. |
ac, pp, fc, pl (scenarios) | IBCS grayscale bars, or an IBCS waterfall when grouping structure is present (see below) | AC: dark gray solid, PP: light gray solid, FC: dark gray hatched, PL: dark gray outlined. |
Example: Scenario columns as bar charts
Section titled “Example: Scenario columns as bar charts”---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: scenario_bars
spec:
dataset: quarterly_data
scenarios: ["ac1", "pp1", "fc1"]
barColumns: ["ac1", "pp1", "fc1"]Scenario columns as an IBCS waterfall
Section titled “Scenario columns as an IBCS waterfall”When a scenario column listed in barColumns appears on a table with grouping
structure (type: sum/opt, or thereof/partof drilldowns), it automatically
renders as an IBCS waterfall instead of plain grayscale bars: data rows cascade
from the running total and sum rows anchor at zero.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_waterfall
spec:
dataset: revenue_by_segment
grouped: true
type: sum
sumTitle: "Revenue waterfall"
scenarios: ["ac1"]
barColumns: ["ac1"]
thereof:
- rowGroup: "Revenue"
category: "Applications"
subCategory: "Applications-A"Notes:
- Waterfall columns auto-scale to fit
barColumnWidth;unitScalingdoes not apply to them (it only affectsd_-prefixed absolute variance bars). - Not supported in combination with
intervalorcolumnthereof— scenario columns on tables using either of those fall back to plain grayscale bars.
Interval column grouping
Section titled “Interval column grouping”interval repeats the entire configured scenario/variance column block once
per interval group, rendered under a spanning header band (e.g.
2023 | 2024 | 2025, each with the same columns):
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_by_year
spec:
dataset: revenue_by_year
scenarios: ["ac1"]
variances: ["dac1_pp1_pos"]
barColumns: ["dac1_pp1_pos"]
interval: yearValues:
| Value | Behaviour |
|---|---|
none (default) | Feature disabled. |
setname | Groups by the dataset's setname column (non-date comparison). Rows with a blank setname are grouped under a — bucket. Blocks are ordered by first appearance in the data. |
year, quarter, month, week, day, hour, minute, second, millisecond | Buckets rows by the dataset's date column at the given granularity. |
auto | Detects the date granularity from the dataset's date span. |
interval and columnthereof are mutually exclusive; if both are set,
columnthereof wins and interval is ignored. A date-based interval on a
dataset with no date values is likewise ignored.
Scaling
Section titled “Scaling”Use scale to shrink or grow the entire table proportionally.
Font size, em-based padding, border widths, SVG bar charts, pin lengths,
dot radii, and hatch patterns all scale together.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: scaled_table
spec:
dataset: revenue_by_segment
scenarios: ["ac1", "pp1"]
scale: auto # shrink to fit the available card widthScale modes
Section titled “Scale modes”| Value | Behaviour |
|---|---|
| not set | Auto-scale to fit the parent width. Emits an AUTO_scale warning with the applied factor. |
none | No scaling. The table renders at its base font size regardless of available space. |
auto | Auto-scale to fit the parent width silently (no warning). |
0.5, 1.2, … | Fixed factor applied to the base font size. All dimensions scale proportionally. |
Inherited props
Section titled “Inherited props”Instead of repeating scenarios, variances, order, and orderDirection on every component, you can inherit them from an ancestor LayoutPage or LayoutCard. Set any of these fields to a special keyword:
| Value | Resolves from |
|---|---|
inherited-closest | Nearest ancestor LayoutCard or LayoutPage |
inherited-page | Nearest ancestor LayoutPage only (skips cards) |
The inherited value is read from the ancestor's corresponding titleScenarios, titleVariances, titleOrder, or titleOrderDirection field. If no ancestor is found, the component falls back to its normal auto-detection logic.
children:
- kind: Table
spec:
dataset: revenue_data
grouped: true
type: sum
scenarios: inherited-page # uses page's titleScenarios
variances: inherited-page # uses page's titleVariancesSee the ChartStructure inherited props section for full examples.
Attribute Reference
Section titled “Attribute Reference”Common Metadata
Section titled “Common Metadata”| Attribute | Type | Required | Default | Description |
|---|---|---|---|---|
apiVersion | string | yes | — | Must be bino.bi/v1alpha1. |
kind | string | yes | — | Must be Table. |
metadata.name | string | yes | — | Unique identifier. |
metadata.labels | object | no | — | Key-value pairs for categorization and constraint matching. |
metadata.annotations | object | no | — | Arbitrary key-value metadata, not used by the system. |
metadata.description | string | no | — | Free-form description. |
metadata.constraints | array | no | — | Conditional inclusion rules. See Constraints. |
Spec Attributes
Section titled “Spec Attributes”| Attribute | Type | Required | Default | Description | Sample |
|---|---|---|---|---|---|
spec.dataset | string, object, or array | yes | — | Dataset reference: a name, an inline DataSet definition, or an array of those (at least one). Provided by the withDataset mixin in the template engine. | dataset: revenue_by_customer |
spec.filter | string | no | "" | AlaSQL WHERE clause fragment to filter rows before rendering. | filter: "region = 'DE'" |
spec.order | string | no | category | Sort key. A scenario key must also appear in scenarios. Values: category, categoryindex, rowgroup, rowgroupindex, ac1–ac4, fc1–fc4, pp1–pp4, pl1–pl4, inherited-closest, inherited-page. | order: ac1 |
spec.orderDirection | string | no | asc | Sort direction. Values: asc, desc, inherited-closest, inherited-page. | orderDirection: desc |
spec.measureScale | string | no | greatest | SI prefix for measure scaling; _ means no prefix. GREATEST / LEAST pick the largest / smallest value in the dataset (write them uppercase). Values: _, k, M, G, T, P, E, Z, Y, m, μ, n, p, f, a, z, y, GREATEST, LEAST. | measureScale: M |
spec.measureType | string | no | volume | Measure interpretation. Values: volume, currency. | measureType: currency |
spec.measureUnit | string | no | "" | Unit string displayed in headers. | measureUnit: "EUR" |
spec.categoryWidth | string | no | w15 | Width of the category column. Values: w5, w10, w15, w20, w25, w50, inf. | categoryWidth: w25 |
spec.dataFormat | string | no | decimal | Number formatting. Values: percent, decimal. | dataFormat: decimal |
spec.dataFormatDigitsDecimal | integer | no | 1 | Number of decimal digits in table cells. | dataFormatDigitsDecimal: 2 |
spec.dataFormatDigitsPercent | integer | no | 2 | Number of percent digits in table cells. | dataFormatDigitsPercent: 1 |
spec.grouped | boolean | no | false | Group rows by rowGroup dimension. | grouped: true |
spec.showGroupTitle | boolean | no | true | Show group header rows when grouped. | showGroupTitle: true |
spec.showMeasureScale | boolean | no | false | Toggle measure unit in table header. | showMeasureScale: true |
spec.limit | integer | no | 0 | Maximum rows per group. Extra rows are cumulated as REST. 0 means unlimited. | limit: 10 |
spec.type | string | no | list | Table type. Values: list, sum, opt, sumnototal, optnototal. Only sum and opt render a grand-total row. | type: sum |
spec.sumTitle | string | no | ❖ | Label of the grand-total row at the bottom of the table (not a title above it). Ignored by the table types that render no total row. Empty renders the IBCS grand-total symbol ❖. Maps to the sum-title HTML attribute. | sumTitle: "Total" |
spec.scenarios | string or array | no | — | Scenario measures to display, as a YAML array or a JSON string. Left blank they are detected from the dataset with a warning. Values: ac1–ac4, fc1–fc4, pp1–pp4, pl1–pl4, auto, inherited-closest, inherited-page. | scenarios: ["ac1", "pp1"] |
spec.variances | string or array | no | — | Variance definitions, as a YAML array or a JSON string. The scenarios used must be listed in scenarios. Pattern: d<scenarioB>_<scenarioA>_[pos|neg|neu]. Also accepts inherited-closest or inherited-page. | variances: ["dac1_pp1_pos"] |
spec.barColumns | string or array | no | — | Column names to render as inline IBCS-compliant bar/pin charts. | barColumns: ["dac1_pp1_pos"] |
spec.barColumnWidth | string | no | w10 | Maximum width of inline bar chart columns. Values: w5, w10, w15, w20, w25, w30, w40, w60, w80, w100. | barColumnWidth: w20 |
spec.unitScaling | number | no | 100 | Data units per em of bar length for absolute variance bars (d_ prefix columns). Larger value = smaller bars. | unitScaling: 50 |
spec.percentageScaling | number | no | 2 | Percentage points per em of pin length for relative variance pins (dr_ prefix columns). | percentageScaling: 1 |
spec.scale | string or number | no | auto-scale with warning | Proportional scaling of the entire table. Omitted: auto-scale with warning. "none": no scaling. "auto": auto-scale silently. Positive number: fixed factor. | scale: auto |
spec.i18nNamespace | string | no | — | I18n namespace for this component's labels; missing keys fall back to _system. Resolved at runtime from the nearest ancestor carrying one (card, page, tree, grid, or the artefact) when not set. Maps to the i18n-namespace HTML attribute. | i18nNamespace: audited |
spec.thereof | string or array | no | [] | Drilldown rows (subCategory level), as a YAML array or a JSON string. See Thereof. | see below |
spec.thereof[].rowGroup | string | no | — | Row group the drilled row belongs to. | rowGroup: "Revenue" |
spec.thereof[].category | string | no | — | Category the drilldown starts from. | category: "Applications" |
spec.thereof[].subCategory | string | no | — | Sub-category rendered as the drilled row. | subCategory: "Applications-A" |
spec.partof | string or array | no | [] | Part-of groupings (category level), as a YAML array or a JSON string. See Partof. | see below |
spec.partof[].rowGroup | string | no | — | Row group holding the drill percentage. | rowGroup: "Revenue" |
spec.partof[].category | string | no | — | Category the percentage is calculated for. | category: "Applications" |
spec.columnthereof | string, array, or null | no | null | Column-level drilldown configuration, as a YAML array or a JSON string. Mutually exclusive with interval (columnthereof wins). See Columnthereof. | see below |
spec.columnthereof[].scenario | string | no | — | Scenario column that is drilled. | scenario: "ac1" |
spec.columnthereof[].name | string | no | — | Name of the drilled column group. | name: "DE" |
spec.columnthereof[].subGroups | array | no | — | Sub-columns rendered under the drilled column. | subGroups: ["Berlin", "Hamburg"] |
spec.interval | string | no | none | Repeats the scenario/variance column block once per interval group. Values: none, setname, year, quarter, month, week, day, hour, minute, second, millisecond, auto. Mutually exclusive with columnthereof. See Interval column grouping. | interval: year |
spec.attributes | string or array | no | — | Computed attribute columns (header label → aggregate expression), in list order; also accepts a JSON object string whose key order defines the column order. See Computed attribute columns. | see below |
spec.attributes[].label | string | yes (per entry) | — | Column header label. | label: "Verkaufsleiter" |
spec.attributes[].expression | string | yes (per entry) | — | Aggregate expression: set, first, last, min, max, avg, sum over a dataset field or a custom _-prefixed field, or lit(constant). | expression: "sum(ac1)" |
spec.selectedStyle | string | no | — | Name of a ComponentStyle manifest to apply. Merged over the _system and _default styles. Maps to the selected-style HTML attribute. | selectedStyle: corporate-style |
spec.ruleset | string | no | — | Name of a RuleSet manifest to apply, or inherited-closest / inherited-page to inherit the surrounding layout's rule set. Merged over the _system and _default rule sets. Maps to the ruleset HTML attribute. | ruleset: corporate-rules |
Thereof (drilldown rows)
Section titled “Thereof (drilldown rows)”spec:
thereof:
- rowGroup: "Revenue"
category: "Applications"
subCategory: "Applications-A"Partof (category groupings)
Section titled “Partof (category groupings)”spec:
partof:
- rowGroup: "Revenue"
category: "Applications"Columnthereof (column drilldown)
Section titled “Columnthereof (column drilldown)”spec:
columnthereof:
- scenario: "ac1"
name: "DE"
subGroups: ["Berlin", "Hamburg"]Attributes (computed columns)
Section titled “Attributes (computed columns)”spec:
attributes:
- label: "Verkaufsleiter"
expression: "set(_leiter)"
- label: "Umsatz gesamt"
expression: "sum(ac1)"