Zum Inhalt

Formular-Versionierung

Formulare ändern sich — ein Feld kommt dazu, eines fällt weg, der Aufbau wird neu sortiert. Bereits gespeicherte Datensätze sollen dabei aber so bleiben, wie sie erfasst wurden. Dafür gibt es die Formularversion.

Optional

Ohne Formularversion ändert sich nichts: Alle Datensätze öffnen mit dem aktuellen Formular. Die Versionierung ist ein bewusster Schritt.

So funktioniert es

  1. In den Formular-Eigenschaften → Formularversion eine Zahl setzen, beginnend mit 1 (Schlüssel kc:formVersion). Beim Speichern friert KCForms Schema und Skripte dieser Version ein.
  2. Jeder neue Datensatz merkt sich die Version, mit der er entstanden ist (Spalte form_version in form_<id>).
  3. Ändert sich das Formular so, dass alte Datensätze nicht mehr passen, erhöhst du die Version (z. B. auf 2) und speicherst. Version 1 bleibt eingefroren erhalten.

Ab dann gilt:

  • Neue Datensätze entstehen mit der neuesten Version.
  • Alte Datensätze öffnen mit genau dem Layout ihrer Version — schreibgeschützt, mit einem Hinweis-Banner.

Solange sich nur Kleinigkeiten ändern (Beschriftung, Hilfetext), musst du die Version nicht erhöhen — dann sehen auch alte Datensätze die Änderung.

Alte Datensätze weiterbearbeiten

Als neuen Satz kopieren

Im Hinweis-Banner eines alten Datensatzes (und über Kopieren in der Werkzeugleiste) steht Als neuen Satz kopieren. Das übernimmt die Werte in einen neuen, ungespeicherten Datensatz der aktuellen Version:

  • Felder, die es noch gibt, werden übernommen (auch Detail-Tabellen).
  • Entfallene Felder werden verworfen — im Original bleiben sie erhalten.
  • Neue Felder bleiben leer.

Der Anwender prüft und speichert den neuen Satz selbst. Mit dem Skript onCopy lässt sich der Entwurf vorbereiten (z. B. Status oder Unterschriften zurücksetzen).

Das Skript canEdit

Die Standardregel „nur die aktuelle Version ist bearbeitbar" lässt sich mit dem Hook canEdit (Reiter Skripte) übersteuern. Er läuft beim Öffnen eines gespeicherten Datensatzes und sieht ctx.form, ctx.recordFormVersion und ctx.currentFormVersion:

// canEdit — Vorgänge im Umlauf bleiben bearbeitbar, verbuchte nicht
if (ctx.form.status === 'verbucht') {
  ctx.cancel('Der Vorgang ist verbucht und kann nicht mehr geändert werden.');
  return;
}
return true;

return false oder ctx.cancel(grund) sperrt (der Grund erscheint im Banner), sonst ist der Datensatz bearbeitbar. Fehler im Skript führen vorsichtshalber zur Standardregel.

Eingefrorene Versionen korrigieren

Auch eine alte Version kann einen Fehler haben — ein Tippfehler im Leittext, ein falscher Druck. Bei versionierten Formularen zeigt der Kopf des Formular-Editors den Umschalter Formularversion N ▾:

  • Wähle dort eine ältere Version. Ein Korrektur-Banner zeigt an, dass du nicht die aktuelle Version bearbeitest.
  • Änderungen an Schema und Skripten speichern nur in diese eingefrorene Version. Die aktuelle Version, die Datenbank-Tabelle und die Versionsnummer bleiben unberührt.
  • Im Formular öffnen ist im Korrekturmodus gesperrt; über den Umschalter kommst du zurück zur aktuellen Version.

Beim Öffnen alter Datensätze wirkt die Korrektur sofort — auch ein korrigiertes canEdit dieser Version.

Transport und Export

Beim Transport reist die komplette Versionsgeschichte mit, damit das Zielsystem alte Datensätze ebenfalls mit ihrem Layout öffnen kann.

Im Datenmodell

form_version ist eine reservierte Spalte jeder Formular-Tabelle; der Reiter Modell im Formular-Editor zeigt sie als System-Spalte. Die eingefrorenen Stände liegen in form_version_snapshot.