# Deine ersten Automatisierungen

## **Automatisierungen und Berechnungen einrichten** <a href="#automatisierungen-und-berechnungen-einrichten" id="automatisierungen-und-berechnungen-einrichten"></a>

Mit deinem Datenmodell kannst du jetzt Automatisierungen und Logik hinzufügen. So arbeitet deine App wie ein Rechnungssystem und nicht nur wie eine statische Datenbank.

Du wirst:

* Logikfelder nutzen, um Positionsbeträge und Summen zu berechnen.
* Sicherstellen, dass Rechnungen später unverändert bleiben, auch wenn sich Produkte oder Kunden ändern.

Warum kopierst du Daten, statt immer verknüpfte Daten anzuzeigen?\
In vielen Fällen kannst du Daten aus einer verknüpften Tabelle einfach über ein Logikfeld anzeigen. So siehst du immer die neueste Version, zum Beispiel den aktuellen Produktpreis.

Für Rechnungen ist das nicht sinnvoll:

* In den meisten Ländern dürfen versendete Rechnungen später nicht geändert werden.
* Produktnamen, Preise oder MwSt.-Sätze können sich im Lauf der Zeit ändern.
* Rechnungsdatensätze müssen so bleiben, wie sie zum Zeitpunkt der Erstellung waren.

Dafür gehst du folgendermaßen vor:

* Du speicherst Kunden- und Produktdaten zentral in ihren Tabellen.
* Du kopierst die relevanten Werte bei der Erstellung per Automatisierung in Rechnungen und Rechnungspositionen.
* Du nutzt diese kopierten Werte für Berechnungen und Ausdrucke.

Schauen wir uns die Automatisierungen in der App „Rechnungsverwaltung“ an.

{% hint style="info" %}
In Automatisierungen musst du die internen Namen von Tabellen und Feldern verwenden. Die Skriptbeispiele auf dieser Seite nutzen interne Namen wie `produktbeschreibung`, `rechnungspositionen` oder `kundennummer`. Ersetze sie bei Bedarf durch die internen Namen deiner eigenen App.
{% endhint %}

### **Produktdaten in Rechnungspositionen kopieren** <a href="#produktdaten-in-rechnungspositionen-kopieren" id="produktdaten-in-rechnungspositionen-kopieren"></a>

Damit Rechnungen unverändert bleiben, auch wenn sich Produktdaten später ändern, kopierst du die wichtigen Produktinformationen in statische Felder der Tabelle „Rechnungspositionen“.

Wenn ein Nutzer im Verknüpfungsfeld „Produkte“ ein Produkt auswählt, soll Folgendes passieren:

* Der Produktname wird in „Produktbeschreibung“ kopiert.
* Der Verkaufspreis wird in „Einzelpreis“ kopiert.

So richtest du das ein:

{% stepper %}
{% step %}
**„Rechnungspositionen“ öffnen**

Öffne in der App-Navigation die Tabelle „Rechnungspositionen“.
{% endstep %}

{% step %}
**Feld-Einstellungen öffnen**

Klicke oben rechts auf das Zahnrad-Symbol, um den **Einstellungsbereich** zu öffnen.\
Wähle den Tab **Felder**.\
Klicke auf das Verknüpfungsfeld „Produkte“, um die Feld-Einstellungen zu öffnen.

<figure><img src="/files/3xKRe6jUr95S59gWpXuY" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Automatisierung „Bei Aktualisierung“ öffnen**

Wechsle zu **Automatisierungen** und wähle **Bei Aktualisierung**.\
Der **Logik-Editor** öffnet sich.

<figure><img src="/files/mWroGjzE2TmIExwdhjsS" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Skript hinzufügen**

Füge das folgende Skript ein. Klicke dann auf **Bestätigen**.

{% code overflow="wrap" %}

```
produktbeschreibung := produkte.produktname; 
einzelpreis := produkte.verkaufspreis;
```

{% endcode %}

Das Skript im Überblick:

* `produktbeschreibung` ist das Zielfeld im aktuellen Datensatz der Tabelle „Rechnungspositionen“.
* `:=` weist diesem Feld einen Wert zu.
* `produkte.produktname` liest den Wert aus dem Feld „Produktname“ des verknüpften Produkts.
* `;` beendet eine Zeile. Nutze es immer dann, wenn noch weitere Zeilen folgen.
* Die zweite Zeile kopiert den Verkaufspreis aus dem verknüpften Produkt in das Feld „Einzelpreis“.
  {% endstep %}
  {% endstepper %}

### **Eine MwSt.-Auswahl in einen Zahlenwert umwandeln** <a href="#eine-mwst-auswahl-in-einen-zahlenwert-umwandeln" id="eine-mwst-auswahl-in-einen-zahlenwert-umwandeln"></a>

In der Tabelle „Produkte“ ist das Feld „MwSt.“ ein Feld vom Typ **Einzelauswahl**. Es liefert einen Textwert wie „19%“. Für Berechnungen brauchst du aber einen Zahlenwert wie `19`.

So löst du das:

* Du behältst „MwSt.“ in „Produkte“ als **Einzelauswahl** für eine klare UI.
* Du pflegst in „Rechnungspositionen“ ein Zahlenfeld „MwSt.-Satz“.
* Du nutzt eine Automatisierung auf dem Feld „Produkte“ in „Rechnungspositionen“, um:
  * den Auswahltext aus `produkte.text(mwst)` zu lesen, zum Beispiel `"19%"`.
  * den ersten Teil `19` zu extrahieren und in eine Zahl umzuwandeln.
  * den Wert in „MwSt.-Satz“ zu speichern.

So richtest du das ein:

{% stepper %}
{% step %}
**Feld-Einstellungen öffnen**

Öffne in der Tabelle „Rechnungspositionen“ den **Einstellungsbereich** und wähle den Tab **Felder**.

Klicke auf das Verknüpfungsfeld „Produkte“, um die Feld-Einstellungen zu öffnen.
{% endstep %}

{% step %}
**Logik „Bei Aktualisierung“ öffnen**

Wechsle zu **Automatisierungen** und wähle **Bei Aktualisierung**.
{% endstep %}

{% step %}
**Skript hinzufügen**

Füge das folgende Skript ein. Klicke dann auf **Bestätigen**.

{% code overflow="wrap" %}

```
mwst_satz := number(item(split(produkte.text(mwst), "%"), 0))
```

{% endcode %}

Das passiert hier:

* `mwst_satz` ist das Zielfeld im aktuellen Datensatz.
* `:=` weist diesem Feld einen Wert zu.
* `produkte.text(mwst)` liest den angezeigten Text des MwSt.-Werts aus dem verknüpften Produkt, zum Beispiel `"19%"`.
* `split(..., "%")` trennt den Text am Prozentzeichen.
* `item(..., 0)` wählt den ersten Teil `"19"` aus. Die Zählung startet bei `0`.
* `number(...)` wandelt den Text `"19"` in den Zahlenwert `19` um.
* Dieser Wert wird bei jeder Aktualisierung des Felds „Produkte“ in „MwSt.-Satz“ gespeichert.
  {% endstep %}
  {% endstepper %}

Du hast jetzt einen numerischen MwSt.-Satz für deine Berechnungen.

### **Summen je Rechnungsposition berechnen** <a href="#summen-je-rechnungsposition-berechnen" id="summen-je-rechnungsposition-berechnen"></a>

In jeder Rechnungsposition berechnest du jetzt den Nettobetrag und den MwSt.-Betrag auf Basis von „Menge“ und „Einzelpreis“.

{% stepper %}
{% step %}
**„Rechnungspositionen“ öffnen**

Wechsle zur Tabelle „Rechnungspositionen“.
{% endstep %}

{% step %}
**Logikfeld „Nettobetrag“ erstellen**

Klicke im Tabellenkopf auf das Symbol **+**, um ein neues Feld hinzuzufügen. Gib als **Feldname** „Nettobetrag“ ein. Behalte den automatisch erzeugten internen Namen bei. Wähle als Feldtyp **Logik**.

<figure><img src="/files/u1D7yoX4nZRWX3cpAXWc" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Logik für den Nettobetrag hinzufügen**

Wechsle zum Tab **Logik**. Füge das folgende Skript ein und klicke dann auf **Bestätigen**.

{% code overflow="wrap" %}

```
einzelpreis * menge
```

{% endcode %}

Damit multiplizierst du den Einzelpreis mit der Menge im selben Datensatz.
{% endstep %}

{% step %}
**Logikfeld „MwSt.-Betrag“ erstellen**

Klicke auf **Weiteres Feld hinzufügen** und wechsle zurück zum Tab **Feld hinzufügen**. Gib als **Feldname** „MwSt.-Betrag“ ein. Behalte den automatisch erzeugten internen Namen bei. Wähle als Feldtyp **Logik**.
{% endstep %}

{% step %}
**Logik für den MwSt.-Betrag hinzufügen**

Wechsle zum Tab **Logik**. Füge das folgende Skript ein und klicke dann auf **Bestätigen**.

{% code overflow="wrap" %}

```
round(menge * einzelpreis * mwst_satz / 100, 2)
```

{% endcode %}

Damit multiplizierst du Menge, Einzelpreis und MwSt.-Satz. Danach teilst du durch `100` und rundest auf zwei Dezimalstellen. Das verhindert spätere Abweichungen bei Rechnungssummen.
{% endstep %}

{% step %}
**Feld speichern**

Klicke auf **Feld hinzufügen**.
{% endstep %}
{% endstepper %}

### **Rechnungssummen berechnen** <a href="#rechnungssummen-berechnen" id="rechnungssummen-berechnen"></a>

In der Tabelle „Rechnungen“ kannst du jetzt die Summen jeder Rechnung berechnen. Dafür addierst du alle verknüpften Rechnungspositionen.

Pro Rechnung willst du sehen:

* die Nettosumme aller Positionen
* die MwSt.-Summe aller Positionen
* die Bruttosumme aus Netto plus MwSt.

So richtest du das ein:

{% stepper %}
{% step %}
**„Rechnungen“ öffnen**

Wechsle zur Tabelle „Rechnungen“.
{% endstep %}

{% step %}
**Logikfeld „Nettosumme“ erstellen**

Erstelle ein Logikfeld, zum Beispiel „Nettosumme“.
{% endstep %}

{% step %}
**Logik für die Nettosumme hinzufügen**

Nutze die Logik:

{% code overflow="wrap" %}

```
sum(rechnungspositionen.nettobetrag)
```

{% endcode %}

Damit addierst du die Nettobeträge aller verknüpften Rechnungspositionen der aktuellen Rechnung.
{% endstep %}

{% step %}
**Logikfeld „MwSt.-Summe“ erstellen**

Erstelle ein weiteres Logikfeld mit dem Namen „MwSt.-Summe“.
{% endstep %}

{% step %}
**Logik für die MwSt.-Summe hinzufügen**

Gib die folgende Logik ein:

{% code overflow="wrap" %}

```
sum(rechnungspositionen.mwst_satz)
```

{% endcode %}

Damit addierst du die MwSt.-Beträge aller verknüpften Rechnungspositionen der aktuellen Rechnung.

Hier nutzt die Funktion `sum()` direkt die Verknüpfung zu den Rechnungspositionen. Im Beispiel heißt sie `rechnungspositionen`. Ninox greift damit automatisch auf alle verknüpften Datensätze der aktuellen Rechnung zu. Du brauchst keine expliziten Schlüsselfelder und keine `select`-Anweisung.
{% endstep %}

{% step %}
**Logikfeld „Bruttosumme“ erstellen**

Erstelle ein weiteres Logikfeld mit dem Namen „Bruttosumme“.
{% endstep %}

{% step %}
**Logik für die Bruttosumme hinzufügen**

Füge die Logik wie folgt ein:

{% code overflow="wrap" %}

```
nettosumme + mwst_summe
```

{% endcode %}

Damit addierst du Nettosumme und MwSt.-Summe zur finalen Rechnungssumme.
{% endstep %}
{% endstepper %}

### **Erwartetes Zahlungsdatum berechnen** <a href="#erwartetes-zahlungsdatum-berechnen" id="erwartetes-zahlungsdatum-berechnen"></a>

In der Tabelle „Rechnungen“ kannst du ein erwartetes Zahlungsdatum auf Basis des Erstellungsdatums und des ausgewählten Felds „Zahlungsziel“ berechnen.

Da „Zahlungsziel“ ein Feld vom Typ **Einzelauswahl** ist, musst du alle möglichen Optionen abdecken. Bei mehreren Optionen ist eine `switch case`-Struktur meist besser lesbar als mehrere verschachtelte `if ... then ... else`-Anweisungen.

{% stepper %}
{% step %}
**„Rechnungen“ öffnen**

Öffne die Tabelle „Rechnungen“.
{% endstep %}

{% step %}
**Feld-Einstellungen öffnen**

Klicke auf das Zahnrad-Symbol, um den **Einstellungsbereich** zu öffnen.

Stelle sicher, dass du im Tab **Felder** bist.
{% endstep %}

{% step %}
**Logikfeld „Erwartetes Zahlungsdatum“ erstellen**

Erstelle ein neues Logikfeld, zum Beispiel „Erwartetes Zahlungsdatum“.
{% endstep %}

{% step %}
**Logik hinzufügen**

Setze die Logik zum Beispiel so:

{% code overflow="wrap" %}

```
switch text(zahlungsziel) do 
    case "1 Woche": 
        erstellungsdatum + 7 
    case "2 Wochen": 
        erstellungsdatum + 14 
    case "30 Tage": 
        erstellungsdatum + 30 
    case "90 Tage": 
        erstellungsdatum + 90 
    default: 
        erstellungsdatum + 30 
end
```

{% endcode %}

Hier passiert Folgendes:

* `switch text(zahlungsziel) do` prüft, welche Option im Feld „Zahlungsziel“ ausgewählt ist.
  * `text(zahlungsziel)` liefert den Textwert der ausgewählten Option. Ohne `text()` würdest du die numerische ID der Option erhalten.
* Jeder `case`-Block definiert, wie das erwartete Datum für eine Option berechnet wird.
  * Bei festen Zeiträumen wie „1 Woche“ oder „30 Tage“ addierst du die passende Anzahl Tage auf das Erstellungsdatum.
* Der `default`-Block definiert das Verhalten, wenn kein `case` passt.
  * Hier wird standardmäßig `30` Tage zum Erstellungsdatum addiert.

Passe die `case`-Texte und Zahlen so an, dass sie genau zu den Werten in deinem Feld „Zahlungsziel“ passen.
{% endstep %}
{% endstepper %}

### **Eindeutige Rechnungsnummern erzeugen** <a href="#eindeutige-rechnungsnummern-erzeugen" id="eindeutige-rechnungsnummern-erzeugen"></a>

Jede Rechnung braucht eine eindeutige Rechnungsnummer. Du kannst sie beim Erstellen einer neuen Rechnung automatisch erzeugen. Nutze dafür die Automatisierung **Bei Erstellung** in der Tabelle „Rechnungen“.

In diesem Beispiel haben Rechnungsnummern das Format:\
`RE-2026-0001` , also: Präfix - Jahr - laufende Nummer mit führenden Nullen.

{% stepper %}
{% step %}
**„Rechnungen“ öffnen**

Öffne die Tabelle „Rechnungen“.
{% endstep %}

{% step %}
**Tabelleneinstellungen öffnen**

Klicke auf das Zahnradsymbol, um den **Einstellungsbereich** zu öffnen.

Wähle die Tabs **Tabelle** und **Einstellungen**.
{% endstep %}

{% step %}
**Automatisierung „Bei Erstellung“ öffnen**

Wähle unter **Automatisierungen** die Option **Bei Erstellung**.
{% endstep %}

{% step %}
**Skript hinzufügen**

Füge das folgende Skript ein und klicke auf **Bestätigen**:

{% code overflow="wrap" %}

```
let myYear := year(today()); 
let myRN := max((select rechnungen where year(erstellungsdatum) = myYear).number(substr(rechnungsnummer, 8))); 
rechnungsnummer := "RE-" + myYear + "-" + format(myRN + 1, "0000"); 
erstellungsdatum := today()
```

{% endcode %}

Hier geschieht Folgendes:

* `myYear` speichert das aktuelle Jahr und nutzt dabei die Funktion `today()`.
* `myRN` ist die Variable, in der die höchste vorhandene Rechnungsnummer des aktuellen Jahres gespeichert wird.
  * Dazu wählt das Skript alle Rechnungen aus, deren Jahr des Erstellungsdatums identisch mit  `myYear` ist.
  * Danach extrahiert es den numerischen Teil von `rechnungsnummer` ab Position `8`, also hinter `"RE-YYYY-"`.
  * `number(...)` entfernt die führenden Nullen und wandelt den String in den Datentyp Zahl um.
  * Anschließend wird mit `max()` der höchste dieser Werte ermittelt.
* `rechnungsnummer := ...` ist das Datenfeld der Rechnungsnummer und wird mit der aktuellsten Rechnungsnummer, die gerade ermittelt wird, gefüllt.
  * Das Skript fügt das Präfix `"RE-"` hinzu,
  * ergänzt das aktuelle Jahr,
  * fügt einen Bindestrich hinzu und
  * ergänzt die erhöhte laufende Nummer im Format `"0000"` mit führenden Nullen.
* `erstellungsdatum := today()` setzt beim Erstellen der Rechnung das Erstellungsdatum auf das heutige Datum.
  {% endstep %}
  {% endstepper %}

### **Eindeutige Kundennummern erzeugen** <a href="#eindeutige-kundennummern-erzeugen" id="eindeutige-kundennummern-erzeugen"></a>

Mit einem ähnlichen Muster erzeugst du eindeutige Kundennummern in der Tabelle „Kunden“, zum Beispiel `KD-00001`.

{% stepper %}
{% step %}
**„Kunden“ öffnen**

Öffne die Tabelle „Kunden“.
{% endstep %}

{% step %}
**Tabellen-Einstellungen öffnen**

Klicke auf das Zahnrad-Symbol, um den **Einstellungsbereich** zu öffnen.

Wähle die Tabs **Tabelle** und **Einstellungen**.
{% endstep %}

{% step %}
**Automatisierung „Bei Erstellung“ öffnen**

Wähle unter **Automatisierungen** die Option **Bei Erstellung**.
{% endstep %}

{% step %}
**Skript hinzufügen**

Füge das folgende Skript ein und klicke auf **Bestätigen**:

{% code overflow="wrap" %}

```
let myLast := max((select kunden).number(substr(kundennummer, 3))); 
kundennummer := "KD-" + format(myLast + 1, "00000")
```

{% endcode %}

Hier passiert Folgendes:

* `select kunden` wählt alle vorhandenen Kunden aus.
* `substr(kundennummer, 3)` ermittelt die Kundennummer ohne Präfix.
  * Aus `KD-00001` wird zum Beispiel `00001`.
* `number(...)` wandelt diesen Text in eine Zahl um.
* `max(...)` liefert die höchste vorhandene Nummer.
* `myLast + 1` erhöht diesen Wert für den neuen Datensatz um 1.
* `format(..., "00000")` formatiert die Nummer mit fünf Stellen und führenden Nullen.
* Das Ergebnis wird mit dem Präfix `"KD-"` kombiniert und in „Kundennummer“ gespeichert.
  {% endstep %}
  {% endstepper %}

### **Beispieldaten zu deiner App hinzufügen** <a href="#beispieldaten-zu-deiner-app-hinzufuegen" id="beispieldaten-zu-deiner-app-hinzufuegen"></a>

Wenn du sehen willst, wie deine erste App mit mehr Daten aussieht, lass Ninox AI Beispieldatensätze für Tests erzeugen.

{% hint style="info" %}
Passe die Tabellen- und Feldnamen im folgenden Prompt an die internen Namen deiner App an. Wenn du dem Leitfaden [Deine erste App](/getting-started/de/builder-getting-started/set-up-your-ninox-manually/your-first-app.md) gefolgt bist, kannst du die hier gezeigten deutschen Namen meist direkt übernehmen.
{% endhint %}

{% stepper %}
{% step %}
**Eine Tabelle im Builder-Modus öffnen**

Öffne eine beliebige Tabelle in deiner App. Wähle im Einstellungsbereich die Tabs **Formular** und danach **Add**. Scrolle zu **Steuerelemente**.

<figure><img src="/files/Vb2Pjkr9zl5lzxemzfrL" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Button erstellen**

Füge ein neues Feld vom Typ **Button** hinzu, indem du es auf das Formular ziehst. Klicke auf das Zahnrad, um die Schnelleinstellungen zu öffnen. Ändere die **Bezeichnung** zu „Beispieldaten erzeugen“.
{% endstep %}

{% step %}
**Button-Automatisierung öffnen**

Wechsle zu **Bei Klick**.
{% endstep %}

{% step %}
**Ninox AI um das Skript bitten**

Füge den folgenden Prompt in den AI Chat (Fragen zu Ninox Script) ein und klicke auf den blauen Pfeil zur Bestätigung.

{% code title="Prompt" overflow="wrap" %}

```
Erstelle ein Skript, das Beispieldaten in vier Tabellen einfügt: kunden, produkte, rechnungen und rechnungspositionen.

kunden:
- Füge 10 Beispieldatensätze in die Tabelle kunden ein.
- Generiere Werte für die kundennummer im Format KD-00001.
- Setze die Nummerierung ab der höchsten vorhandenen kundennummer fort.
- Ermittle den aktuellen maximalen Wert mit:
  max(number(substr(kundennummer, 3)))
- Beginne bei max + 1 und erstelle 10 aufeinanderfolgende eindeutige Werte für kundennummer.

produkte:
- Füge 10 Beispieldatensätze in die Tabelle produkte ein.
- Generiere Were für product_number im Format PR-001.
- Setze die Nummerierung ab der höchsten vorhandenen product_number fort.
- Extrahiere den numerischen Teil aus product_number, ermittie das aktuelle Maximum und erstelle dann 10 aufeinanderfolgende eindeutige Zahlen mit 3-stelliger Nullauffüllung.

rechnungen:
- Fügen 10 Beispieldatensätze in die Tabelle rechnungen ein.
- Generiere Werte für rechnungsnummer im Format „RE-YYYY-0000“, wobei „YYYY“ für das aktuelle Jahr steht.
- Setze die Nummerierung ab der höchsten vorhandenen rechnungsnummer in diesem Format fort.
- Ermittle den aktuellen maximalen Wert mit:
  max(number(substr(rechnungsnummer, 8)))
- Beginne bei „max + 1“ und erstelle 10 aufeinanderfolgende eindeutige Zahlen.
- Verknüpfe jede Rechnung über die Verknüpfung kunden in der rechnungs-Tabelle mit einem bestehenden Kunden.

rechnungspositionen:
- Erstelle für jeden Datensatz in der Tabelle rechnungen mindestens 3 Datensätze in der Tabelle rechnungspositionen und verknüpfe diese mit dem jeweiligen datensatz der Tabelle rechnungen.
- Verknüpfe jede Rechnungsposition mit einem Produkt aus der Tabelle produkte.
- Verwende dasselbe Produkt nicht mehrfach innerhalb derselben Rechnung.

Vermeide, Variablen den gleichen Namen zu geben, der schon für Feldnamen in diesen Tabellen verwendet wird. Am besten gibst Variablen immer einen Präfix an dem du erkennst, dass es sich um eine Variable handelt, z. B.: "my..." >> "myName".
```

{% endcode %}
{% endstep %}

{% step %}
**Generiertes Skript übernehmen**

Ninox AI erzeugt nun das Skript, dies kann einen Moment dauern. Wenn Ninox AI das Skript in den Logik-Editor einfügt, klicke auf <i class="fa-check">:check:</i> **Annehmen**. Klicke danach auf **Bestätigen**.
{% endstep %}

{% step %}
**Button ausführen**

Beende den **Builder-Modus** im Toggle unten links und klicke auf deinen neuen Button.

Wenn die Struktur deiner App zu diesem Leitfaden passt, erstellt Ninox Beispieldatensätze in allen vier Tabellen.
{% endstep %}
{% endstepper %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ninox.com/getting-started/de/builder-getting-started/set-up-your-ninox-manually/your-first-automations.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
