Skip to content
GitHub

Table

Table manifests describe tables bound to datasets. They control formatting, grouping, scenarios, and optional drilldown views.

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).

  • dataset – required dataset reference: a name, an inline DataSet definition, or an array of those.
  • filter – optional filter expression.
  • order – sort key; using scenario names requires them to appear in scenarios. Default: category.
  • orderDirection – sort direction (asc or desc).
  • 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 by rowgroup and 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). Only sum and opt render 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, or auto. When set to auto, 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 form d<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 accepts auto (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); 2 means a +2 % pin is 1 em long. Also accepts auto or 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_scale warning 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.
  • 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 with columnthereof (columnthereof wins). 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 a ComponentStyle to apply; merged over the _system and _default styles.
  • ruleset – optional name of a RuleSet to apply, or inherited-closest / inherited-page to inherit the surrounding layout's rule set; merged over the _system and _default rule sets.
---
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"]

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)"}'
FunctionResult
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. lit accepts any non-empty constant.
  • Results of min, max, avg, and sum are 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 thereof drill 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.15 or newer; older engines silently ignore the attribute.

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: 1
Column prefixVisualizationDescription
d_ (absolute variance)Horizontal barBar extends left (negative) or right (positive) from center axis. Green for positive-good, red for negative-bad.
dr_ (relative variance)Pin/dot chartThin 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.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: scenario_bars
spec:
  dataset: quarterly_data
  scenarios: ["ac1", "pp1", "fc1"]
  barColumns: ["ac1", "pp1", "fc1"]

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; unitScaling does not apply to them (it only affects d_-prefixed absolute variance bars).
  • Not supported in combination with interval or columnthereof — scenario columns on tables using either of those fall back to plain grayscale bars.

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: year

Values:

ValueBehaviour
none (default)Feature disabled.
setnameGroups 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, millisecondBuckets rows by the dataset's date column at the given granularity.
autoDetects 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.

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 width
ValueBehaviour
not setAuto-scale to fit the parent width. Emits an AUTO_scale warning with the applied factor.
noneNo scaling. The table renders at its base font size regardless of available space.
autoAuto-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.

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:

ValueResolves from
inherited-closestNearest ancestor LayoutCard or LayoutPage
inherited-pageNearest 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 titleVariances

See the ChartStructure inherited props section for full examples.

AttributeTypeRequiredDefaultDescription
apiVersionstringyesMust be bino.bi/v1alpha1.
kindstringyesMust be Table.
metadata.namestringyesUnique identifier.
metadata.labelsobjectnoKey-value pairs for categorization and constraint matching.
metadata.annotationsobjectnoArbitrary key-value metadata, not used by the system.
metadata.descriptionstringnoFree-form description.
metadata.constraintsarraynoConditional inclusion rules. See Constraints.
AttributeTypeRequiredDefaultDescriptionSample
spec.datasetstring, object, or arrayyesDataset 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.filterstringno""AlaSQL WHERE clause fragment to filter rows before rendering.filter: "region = 'DE'"
spec.orderstringnocategorySort key. A scenario key must also appear in scenarios. Values: category, categoryindex, rowgroup, rowgroupindex, ac1ac4, fc1fc4, pp1pp4, pl1pl4, inherited-closest, inherited-page.order: ac1
spec.orderDirectionstringnoascSort direction. Values: asc, desc, inherited-closest, inherited-page.orderDirection: desc
spec.measureScalestringnogreatestSI 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.measureTypestringnovolumeMeasure interpretation. Values: volume, currency.measureType: currency
spec.measureUnitstringno""Unit string displayed in headers.measureUnit: "EUR"
spec.categoryWidthstringnow15Width of the category column. Values: w5, w10, w15, w20, w25, w50, inf.categoryWidth: w25
spec.dataFormatstringnodecimalNumber formatting. Values: percent, decimal.dataFormat: decimal
spec.dataFormatDigitsDecimalintegerno1Number of decimal digits in table cells.dataFormatDigitsDecimal: 2
spec.dataFormatDigitsPercentintegerno2Number of percent digits in table cells.dataFormatDigitsPercent: 1
spec.groupedbooleannofalseGroup rows by rowGroup dimension.grouped: true
spec.showGroupTitlebooleannotrueShow group header rows when grouped.showGroupTitle: true
spec.showMeasureScalebooleannofalseToggle measure unit in table header.showMeasureScale: true
spec.limitintegerno0Maximum rows per group. Extra rows are cumulated as REST. 0 means unlimited.limit: 10
spec.typestringnolistTable type. Values: list, sum, opt, sumnototal, optnototal. Only sum and opt render a grand-total row.type: sum
spec.sumTitlestringnoLabel 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.scenariosstring or arraynoScenario measures to display, as a YAML array or a JSON string. Left blank they are detected from the dataset with a warning. Values: ac1ac4, fc1fc4, pp1pp4, pl1pl4, auto, inherited-closest, inherited-page.scenarios: ["ac1", "pp1"]
spec.variancesstring or arraynoVariance 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.barColumnsstring or arraynoColumn names to render as inline IBCS-compliant bar/pin charts.barColumns: ["dac1_pp1_pos"]
spec.barColumnWidthstringnow10Maximum width of inline bar chart columns. Values: w5, w10, w15, w20, w25, w30, w40, w60, w80, w100.barColumnWidth: w20
spec.unitScalingnumberno100Data units per em of bar length for absolute variance bars (d_ prefix columns). Larger value = smaller bars.unitScaling: 50
spec.percentageScalingnumberno2Percentage points per em of pin length for relative variance pins (dr_ prefix columns).percentageScaling: 1
spec.scalestring or numbernoauto-scale with warningProportional scaling of the entire table. Omitted: auto-scale with warning. "none": no scaling. "auto": auto-scale silently. Positive number: fixed factor.scale: auto
spec.i18nNamespacestringnoI18n 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.thereofstring or arrayno[]Drilldown rows (subCategory level), as a YAML array or a JSON string. See Thereof.see below
spec.thereof[].rowGroupstringnoRow group the drilled row belongs to.rowGroup: "Revenue"
spec.thereof[].categorystringnoCategory the drilldown starts from.category: "Applications"
spec.thereof[].subCategorystringnoSub-category rendered as the drilled row.subCategory: "Applications-A"
spec.partofstring or arrayno[]Part-of groupings (category level), as a YAML array or a JSON string. See Partof.see below
spec.partof[].rowGroupstringnoRow group holding the drill percentage.rowGroup: "Revenue"
spec.partof[].categorystringnoCategory the percentage is calculated for.category: "Applications"
spec.columnthereofstring, array, or nullnonullColumn-level drilldown configuration, as a YAML array or a JSON string. Mutually exclusive with interval (columnthereof wins). See Columnthereof.see below
spec.columnthereof[].scenariostringnoScenario column that is drilled.scenario: "ac1"
spec.columnthereof[].namestringnoName of the drilled column group.name: "DE"
spec.columnthereof[].subGroupsarraynoSub-columns rendered under the drilled column.subGroups: ["Berlin", "Hamburg"]
spec.intervalstringnononeRepeats 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.attributesstring or arraynoComputed 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[].labelstringyes (per entry)Column header label.label: "Verkaufsleiter"
spec.attributes[].expressionstringyes (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.selectedStylestringnoName of a ComponentStyle manifest to apply. Merged over the _system and _default styles. Maps to the selected-style HTML attribute.selectedStyle: corporate-style
spec.rulesetstringnoName 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
spec:
  thereof:
    - rowGroup: "Revenue"
      category: "Applications"
      subCategory: "Applications-A"
spec:
  partof:
    - rowGroup: "Revenue"
      category: "Applications"
spec:
  columnthereof:
    - scenario: "ac1"
      name: "DE"
      subGroups: ["Berlin", "Hamburg"]
spec:
  attributes:
    - label: "Verkaufsleiter"
      expression: "set(_leiter)"
    - label: "Umsatz gesamt"
      expression: "sum(ac1)"