---
title: flexi-dynamic-table
---

Die dynamische Tabelle ermöglicht die strukturierte Erfassung mehrerer gleichartiger Datensätze innerhalb eines Formulars. Die Spalten der Tabelle werden im Template frei definiert; pro Spalte stehen verschiedene Eingabetypen zur Verfügung (Text, Zahl, Datum, Auswahl, Vorschlagsliste, Berechnung).

Im fertigen Dokument können Zeilen über eine Schaltfläche hinzugefügt, bearbeitet, dupliziert, neu sortiert und gelöscht werden. Optional steht eine Schnellerfassung für eine einzelne Spalte zur Verfügung.

## Einstellungen

### Allgemeine Tabellen-Einstellungen

| Einstellung | Beschreibung |
|---|---|
| Bezeichnung | Der angezeigte Titel der Tabelle |
| Name | Eindeutiger Bezeichner der Tabelle (wird automatisch aus der Bezeichnung abgeleitet) |
| Zeilennummern anzeigen | Wenn aktiv, wird vor jeder Zeile eine fortlaufende Nummer angezeigt |
| Eingabe gesperrt | Verhindert das Hinzufügen und Bearbeiten von Zeilen - Zeilen können nur noch gelöscht werden. Sinnvoll für Tabellen, die durch eine andere Funktion (z. B. Datenimport) befüllt werden |
| Zeilen duplizieren erlauben | Aktiviert pro Zeile eine Schaltfläche zum Duplizieren. Die neue Zeile übernimmt alle Werte der Quellzeile |
| Mindestanzahl Zeilen | Mindestanzahl an Zeilen, die die Tabelle enthalten muss. Wird die Anzahl unterschritten, gilt die Tabelle als ungültig und es erscheint eine Warnung |
| Maximalanzahl Zeilen | Maximalanzahl an Zeilen. Ist die Grenze erreicht, ist die Schaltfläche zum Hinzufügen deaktiviert |
| Schnellerfassung-Spalte | Auswahl einer Spalte, die per Schnellerfassungs-Dialog für alle bestehenden Zeilen auf einmal befüllt werden kann (siehe [Schnellerfassung](#schnellerfassung)) |
| Schnelleingabe-Anzeigespalte | Spalte, deren Wert im Schnellerfassungs-Dialog als Zeilenbezeichnung dient. Ohne Auswahl wird die Zeilennummer verwendet |
| Komponente deaktiviert | Sperrt die gesamte Tabelle - dauerhaft oder abhängig von einem anderen Feld (siehe [Komponente deaktivieren](#komponente-deaktivieren)) |

### Erweiterte Einstellungen

Über **Erweiterte Einstellungen** lassen sich zusätzlich definieren:

- **Validierungsregeln** für die Tabellenzeilen (siehe [Validierungsregeln](#validierungsregeln))
- **Standardwerte** - vordefinierte Zeilen, mit denen die Tabelle beim Anlegen eines neuen Dokuments vorbefüllt wird

Werden nach dem Anlegen von Standardwerten Spalten umbenannt oder entfernt, erscheint im Dialog eine Warnung. Über die Schaltfläche **Standardwerte aufräumen** lassen sich die Standardwerte automatisch an die aktuellen Spalten anpassen (überzählige Schlüssel werden entfernt, fehlende mit leerem Wert ergänzt).

### Spalten-Einstellungen

Spalten werden einzeln über die Schaltfläche **Spalte hinzufügen** angelegt und über die Reorder-Griffe sortiert.

| Einstellung | Beschreibung | Verfügbar bei |
|---|---|---|
| Bezeichnung | Anzeigetext der Spalte (Spaltenüberschrift, Feldlabel im Bearbeitungsdialog) | alle Typen |
| Name | Eindeutiger Bezeichner der Spalte (wird automatisch aus der Bezeichnung abgeleitet) | alle Typen |
| Typ | Datentyp der Spalte: `text`, `number`, `date`, `select`, `typeahead`, `calculated` | alle Typen |
| Platzhalter | Platzhaltertext im Eingabefeld | text, number, date, select, typeahead |
| Pflichtfeld | Wenn aktiv, muss die Zelle ausgefüllt werden, sonst wird die Zeile als Fehler markiert | alle Typen |
| In Tabelle anzeigen | Wenn deaktiviert, ist die Spalte nur im Bearbeitungsdialog sichtbar, in der Tabellenübersicht jedoch ausgeblendet. Die Anzahl ausgeblendeter Spalten wird als Hinweis angezeigt; die Werte sind per Tooltip einsehbar | alle Typen |
| Optionen | Liste der Auswahlwerte | select, typeahead (bei Quelle „Optionen“) |
| Vorschlagstyp | Quelle der Vorschlagswerte: aus einer hinterlegten **Datenliste** oder aus einer manuell gepflegten **Optionsliste** | typeahead |
| Datenquelle | Name der Datenliste, aus der die Vorschläge geladen werden | typeahead (bei Quelle „Datenliste“) |
| Suchfeld | Feld der Datenliste, das durchsucht und als Vorschlag angeboten wird | typeahead (bei Quelle „Datenliste“) |
| Formel | Rechenausdruck, der den Wert der Spalte automatisch aus anderen Spalten derselben Zeile berechnet | calculated |
| Nachkommastellen | Anzahl der Dezimalstellen, auf die das Berechnungsergebnis gerundet wird | calculated |

## Spaltentypen im Detail

### text

Einfache Texteingabe.

### number

Numerische Eingabe. Der Wert kann in Berechnungs-Spalten weiterverwendet werden. Sowohl Komma als auch Punkt sind als Dezimaltrennzeichen zulässig.

### date

Datumsauswahl mit Kalender-Popup im Format `TT.MM.JJJJ`.

### select

Auswahl aus einer fest hinterlegten Liste von Optionen. Die Optionen werden in den Spalten-Einstellungen einzeln eingetragen und lassen sich per Drag-and-Drop sortieren.

Ist ein Wert gewählt, erscheint im Eingabefeld ein **X**, mit dem die Auswahl wieder geleert werden kann. Das gilt im Bearbeiten-Dialog der Zeile, in der [Schnellerfassung](#schnellerfassung) und bei den Standardwerten im Template-Editor. Bei einer gesperrten Tabelle wird das X nicht angeboten; wird eine Pflichtspalte geleert, gilt die Zeile anschließend als unvollständig.

### typeahead

Eingabefeld mit Autovervollständigung. Während der Eingabe werden passende Vorschläge angeboten, eine freie Eingabe abweichend von den Vorschlägen ist weiterhin möglich.

Die Vorschläge stammen wahlweise aus:

- **Optionen** - eine in den Spalten-Einstellungen manuell gepflegte Liste
- **Datenliste** - eine zentral gepflegte Datenliste. Hier wird zusätzlich das Suchfeld angegeben, dessen Werte als Vorschläge erscheinen

### calculated

Spalte mit automatisch berechnetem Wert. Die Formel referenziert andere Spalten **derselben Zeile** über deren Spaltennamen:

```
menge * einzelpreis
```

Erlaubt sind Standard-Rechenoperatoren (`+`, `-`, `*`, `/`, `**`), Klammerung sowie Funktionen wie `Math.round`, `Math.abs`, `Math.sqrt`, `Math.min`, `Math.max` und `Math.PI`.

Ist eine in der Formel referenzierte Spalte leer, bleibt das Berechnungsergebnis leer. Über **Nachkommastellen** lässt sich das Ergebnis auf eine feste Dezimalstellenzahl runden.

Berechnete Spalten können nicht als Schnellerfassungs-Spalte gewählt werden.

## Verhalten im Dokument

### Zeilen hinzufügen, bearbeiten und löschen [#zeilen-hinzufugen-bearbeiten-und-loschen]

Über die Schaltfläche **Zeile hinzufügen** öffnet sich ein Dialog mit allen Spalten der Tabelle als Eingabefelder. Beim Speichern wird die Zeile übernommen.

- **Bearbeiten** - über das Stift-Symbol an der Zeile öffnet sich derselbe Dialog mit den vorhandenen Werten.
- **Löschen** - über das Mülleimer-Symbol; vor dem Löschen erfolgt eine Sicherheitsabfrage.
- **Duplizieren** - falls in den Tabellen-Einstellungen aktiviert, kopiert das Symbol die Zeile als neue Zeile direkt darunter.
- **Sortieren** - Zeilen lassen sich über den Reorder-Griff am rechten Rand per Drag-and-Drop neu anordnen.

Ist die Tabelle als **Eingabe gesperrt** konfiguriert, entfallen die Schaltflächen zum Hinzufügen und Bearbeiten; vorhandene Zeilen können nur noch gelöscht werden.

### Komponente deaktivieren [#komponente-deaktivieren]

Mit **Komponente deaktiviert** wird die Tabelle vollständig gesperrt: Zeilen können weder hinzugefügt, bearbeitet, gelöscht noch umsortiert werden. Die Tabelle wird dabei ausgegraut dargestellt, damit sofort erkennbar ist, dass sie nicht zur Verfügung steht. Eine deaktivierte Tabelle macht ihren Abschnitt nicht ungültig - Mindestanzahl und Validierungsregeln werden in diesem Zustand nicht geprüft.

Ist zusätzlich **Komponente deaktiviert mit Abhängigkeit** aktiv, wird die Tabelle nur unter einer bestimmten Bedingung gesperrt:

| Einstellung | Beschreibung |
|---|---|
| Abhängigkeit Pfad | Name des Feldes, das geprüft wird. Für ein Feld im selben Abschnitt genügt der Name (`auswahl`); für ein Feld in einem anderen Abschnitt: `abschnitt.feld` |
| Vergleichswert (optional) | Bestimmter Wert, mit dem das abhängige Feld verglichen wird |
| Komponente deaktiviert, wenn | Ohne Vergleichswert: **Abhängigkeit inaktiv/leer** oder **Abhängigkeit aktiv/gefüllt**. Mit Vergleichswert: **Wert stimmt überein** oder **Wert stimmt nicht überein** |

Ändert sich ein Feld im selben Abschnitt, wird die Sperre sofort neu ausgewertet.

Im Unterschied zu **Eingabe gesperrt** (Zeilen können noch gelöscht werden, z. B. bei Befüllung per Datenimport) ist die Tabelle bei **Komponente deaktiviert** komplett schreibgeschützt.

### Anzeige der Zeilenanzahl

Rechts oben in der Tabelle wird die aktuelle Zeilenanzahl angezeigt. Sind **Mindestanzahl** und/oder **Maximalanzahl** konfiguriert, wechselt die Anzeige die Farbe:

- **rot** - die Mindestanzahl ist unterschritten
- **grün** - die Anzahl ist im erlaubten Bereich

Liegt die Anzahl unter der Mindestanzahl, wird zusätzlich ein Hinweistext unterhalb der Tabelle angezeigt und die Tabelle gilt als ungültig.

### Pflichtfelder

Ist eine Spalte als **Pflichtfeld** markiert und in einer Zeile leer, wird die Zeile mit einem roten Fehler-Symbol markiert - unabhängig davon, ob für die Tabelle Validierungsregeln konfiguriert sind.

### Ausgeblendete Spalten

Spalten mit deaktivierter Option **In Tabelle anzeigen** erscheinen nicht in der Spaltenübersicht. Stattdessen erscheint pro Zeile eine Schaltfläche mit der Anzahl ausgeblendeter Spalten; per Tooltip lassen sich deren Werte einsehen. Im Bearbeitungsdialog stehen ausgeblendete Spalten weiterhin zur Verfügung.

## Schnellerfassung

Die **Schnellerfassung** ist gedacht für Tabellen, in denen eine einzelne Spalte aller bestehenden Zeilen nacheinander erfasst werden soll - etwa eine Mess- oder Ist-Spalte zu einer vorgegebenen Liste von Prüfpunkten.

Wird in den Tabellen-Einstellungen unter **Schnellerfassung-Spalte** eine Spalte gewählt, erscheint im Dokument neben **Zeile hinzufügen** eine zusätzliche Schaltfläche **Schnellerfassung**. Diese öffnet einen Dialog, in dem die Werte aller Zeilen für die gewählte Spalte untereinander direkt eingegeben werden können. Beim Speichern werden die Werte zurück in die Tabelle übernommen und Berechnungen werden aktualisiert.

Standardmäßig sind die Eingabefelder im Dialog durchnummeriert (*1, 2, 3 …*). Ist unter **Schnelleingabe-Anzeigespalte** eine Spalte hinterlegt, erscheint stattdessen deren Wert als Zeilenbezeichnung - etwa die Bezeichnung des Prüfpunkts statt der bloßen Nummer. Das erleichtert die Zuordnung, wenn viele Zeilen erfasst werden.

Voraussetzungen:

- Die Tabelle enthält bereits Zeilen
- Die Spalte ist nicht vom Typ `calculated`
- Die Tabelle ist nicht als **Eingabe gesperrt** konfiguriert

## Validierungsregeln

Über die erweiterten Einstellungen lassen sich Regeln hinterlegen, die für **jede einzelne Zeile** geprüft werden. Die Tabelle gilt insgesamt nur dann als gültig, wenn alle Zeilen die Regeln erfüllen. Pro Zeile wird der Status als Symbol angezeigt:

- **Grüner Haken** - Zeile erfüllt alle Regeln
- **Rotes Kreuz** - Zeile verletzt mindestens eine Regel oder es fehlt ein Pflichtfeld

In der dynamischen Tabelle sind alle Vergleichsoperatoren (`>`, `<`) **strikt** - anders als bei Zahlenfeldern.

### Wert einer Spalte prüfen - `VALUE:spalte` [#wert-einer-spalte-prufen-valuespalte]

| Schreibweise | Bedeutung |
|---|---|
| `VALUE:spalte>=n` | Wert der Spalte muss mindestens `n` betragen |
| `VALUE:spalte<=n` | Wert der Spalte darf höchstens `n` betragen |
| `VALUE:spalte>n` | Wert der Spalte muss strikt größer als `n` sein |
| `VALUE:spalte<n` | Wert der Spalte muss strikt kleiner als `n` sein |
| `VALUE:spalte==wert` | Wert der Spalte muss exakt `wert` entsprechen |
| `VALUE:spalte!=wert` | Wert der Spalte darf nicht `wert` entsprechen |

```json
"rules": ["VALUE:menge>=5"]
```
> In jeder Zeile muss die Spalte `menge` mindestens 5 sein.

### Toleranzbereich - `VALUE:spalte%p:refSpalte` [#toleranzbereich-valuespalteprefspalte]

| Schreibweise | Bedeutung |
|---|---|
| `VALUE:spalte%p:refSpalte` | Wert in `spalte` muss innerhalb von ± p % von `refSpalte` (anderer Spalte derselben Zeile) liegen |
| `VALUE:spalte%MINp:refSpalte` | `refSpalte` darf nicht mehr als p % **unter** dem Wert in `spalte` liegen |
| `VALUE:spalte%MAXp:refSpalte` | `refSpalte` darf nicht mehr als p % **über** dem Wert in `spalte` liegen |

Statt einer anderen Spalte kann mit `@`-Prefix auch ein **Feld außerhalb der Tabelle** (im selben Abschnitt) als Referenz verwendet werden. Der `@`-Prefix ist auf beiden Seiten erlaubt.

```json
"rules": ["VALUE:ist%5:@sollwert_section"]
```
> Die Spalte `ist` muss innerhalb von ± 5 % vom Abschnitts-Feld `sollwert_section` liegen.

### Vergleich zweier Spalten oder gegen ein externes Feld - `COMPARE` [#vergleich-zweier-spalten-oder-gegen-ein-externes-feld-compare]

| Schreibweise | Bedeutung |
|---|---|
| `COMPARE:spalte1>=spalte2` | Vergleich zweier Spalten derselben Zeile |
| `COMPARE:spalte>=100` | Vergleich gegen eine Konstante |
| `COMPARE:spalte<=@feld` | Vergleich der Spalte gegen ein Feld außerhalb der Tabelle (Abschnitts-Feld), markiert mit `@` |

Unterstützte Operatoren in `COMPARE`: `>=`, `<=`, `<`, `>`, `==`, `!=` (alle strikt). Formeln mit `+`/`-` (wie in Zahlenfeldern) werden in Tabellen **nicht** unterstützt.

```json
"rules": ["COMPARE:rabatt<=preis"]
```
> In jeder Zeile darf `rabatt` nicht größer sein als `preis`.

```json
"rules": [
  "COMPARE:ist>=@soll_min",
  "COMPARE:ist<=@soll_max"
]
```
> Der Ist-Wert in der Spalte `ist` muss zwischen den Abschnitts-Feldern `soll_min` und `soll_max` liegen.

### Länge einer Text-Spalte - `COMPONENT` [#lange-einer-text-spalte-component]

| Schreibweise | Bedeutung |
|---|---|
| `COMPONENT:spalte.length>n` | Die Spalte muss mehr als `n` Zeichen enthalten |

### Tabelle ohne Regeln

Eine Tabelle ohne hinterlegte Regeln gilt grundsätzlich als gültig - vorausgesetzt, alle Pflichtfelder sind gefüllt und die Mindestanzahl an Zeilen ist erreicht. Sobald eine Zeile Daten enthält, aber weder Regeln noch Pflichtfelder definiert sind, wird die Zeile ohne Statussymbol dargestellt.

Eine ausführliche Übersicht über alle Regelarten und das Badge-Konzept findet sich unter [Prüfungsregeln](/components/rules).
