> For the complete documentation index, see [llms.txt](https://docs.ninox.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ninox.com/ninox-scripting/de/automate-your-workflows/work-with-functions/system-flow-control-and-ai.md).

# System, Ablaufsteuerung und Ninox AI

Lerne, wie du Skripte pausierst und den Ausführungskontext der App prüfst.

Funktionen für System und Ablaufsteuerung helfen dir, Timing und umgebungsspezifisches Verhalten zu steuern. Du kannst ein Skript pausieren, Rohwerte prüfen und den App-Kontext erkennen.

In diesem Kapitel lernst du, wie du:

* Timing in einem laufenden Skript steuerst.
* die aktuelle App-Umgebung und den Datenbankstatus prüfst.

<table><thead><tr><th width="233.96484375">Funktion (A-Z)</th><th>Aufgabe</th></tr></thead><tbody><tr><td><code>aiPrompt()</code></td><td>Ruft strukturierte Daten mit Hilfe von Ninox AI ab.</td></tr><tr><td><code>eval()</code></td><td>Führt einen Text als Ninox Skript aus.</td></tr><tr><td><code>ninoxApp()</code></td><td>Gibt den aktuellen Client- oder App-Kontext zurück.</td></tr><tr><td><code>raw()</code></td><td>Gibt die interne Textdarstellung zurück.</td></tr><tr><td><code>sleep()</code></td><td>Pausiert ein Skript kurz.</td></tr></tbody></table>

## Timing und Ausführungsreihenfolge steuern

Nutze diese Funktionen, wenn eine Aktion erst nach einer anderen ausgeführt werden soll.

### Ein Skript kurz pausieren <a href="#pause-a-script-with-sleep" id="pause-a-script-with-sleep"></a>

Nutze `sleep()`, damit Ninox eine angegebene Anzahl an Millisekunden wartet, bevor das Skript weiterläuft.

Nutze es, wenn du:

* eine kurze Verzögerung vor einer Folgeaktion einbauen willst.
* Timing-Probleme in einem UI-Ablauf vermeiden willst.
* kurz warten willst, bis sich ein anderer Prozess stabilisiert.
* einen Hinweis oder eine Warnung anzeigen willst, bevor der nächste Schritt läuft.

`sleep(number)`

* `number` die Verzögerung in Millisekunden

`sleep()` gibt keinen Wert zurück.

#### Schauen wir uns einige Beispiele an:

```ninox
sleep(2000)
```

Pausiert das Skript für 2 Sekunden.

Tipps:

* Halte Verzögerungen so kurz wie möglich.
* Nutze eine Verzögerung nur, wenn der Ablauf sie wirklich braucht.

## Rohwerte und Bereichsgrenzen prüfen

Nutze diese Funktionen, wenn du den zugrunde liegenden Wert oder die Startgrenze eines Dauer- oder Bereichskontexts brauchst.

### Den Rohwert prüfen <a href="#inspect-the-raw-value" id="inspect-the-raw-value"></a>

Nutze `raw()`, um die interne rohe Textdarstellung eines Werts zurückzugeben.

Nutze es, wenn du:

* formatierten Text in seine rohe Textform umwandeln willst.
* den internen Wert hinter einem Farbfeld lesen willst.
* formatierte Inhalte in Dialogen oder E-Mails wiederverwenden willst.
* die Rohform mit der angezeigten Form vergleichen willst.

`raw(any)`

* `any` der Wert, den du in Rohform zurückgeben willst

`raw()` gibt einen String zurück.

#### Schauen wir uns einige Beispiele an:

```ninox
raw('My sample text')
```

Gibt den Inhalt eines formatierten Textwerts als unformatierten Text mit HTML-Tags zurück.

```ninox
dialog("Hello", raw('Dialog text'), ["Yes", "No"])
```

Zeigt einen Dialog mit dem Inhalt des formatierten Textfelds `Dialog text`.

```ninox
raw(Color)
```

Gibt den internen Farbwert zurück, zum Beispiel `#EC87E2`.

Tipps:

* Nutze `raw()`, wenn du die interne Textdarstellung des Systems brauchst.
* Das ist nützlich für formatierte Textfelder, Dialoge und E-Mails.
* Du kannst das Ergebnis später wieder mit `html()` formatieren.

### Text als Logik ausführen und Daten mit `eval()` prüfen

Nutze `eval()`, um Text als Ninox Skript auszuführen.

Damit erstellst du dynamische Ausdrücke. Verwende zum Beispiel Namen von Tabellen, Feldern und Variablen, die sich zur Laufzeit ändern.

`eval(string, nid)`

* `string` Text mit Berechnungen oder einem Ninox Skript
* `nid` Datensatz, auf den das Skript angewendet wird

#### Schauen wir uns einige Beispiele an:

```
eval(manuelle_formel, this) 
```

Gibt `20` zurück, wenn das Feld "Manuelle Formel" im aktuellen Datensatz `14 + 6 \* 0.5 \* 2` enthält.

<pre><code><strong>let myTabelle := "rechnungen"; 
</strong>eval("sum((select " + myTabelle + ").betrag)", this)
</code></pre>

Gibt die Summe aller Beträge in der Tabelle "Rechnungen" zurück.

```
let myText := "alert(""Das ist ein Test."")"; 
eval(myText, this)
```

Zeigt eine Meldung mit dem Text "Das ist ein Test." an.

```
let myFeld := "vollstaendiger_name"
eval(myFeld, this) 
```

Gibt den Wert "Toni Kim" aus dem Feld "Vollständiger Name" zurück. Bei einem Auswahlfeld gibt die Funktion den Index des Werts zurück.

```
let myAuswahl := "Auswahlfeld";
eval("text(" + myAuswahl + ")", this)
```

Gibt den Textwert der gewählten Option eines Auswahlfelds zurück.

```
let myTabelle := "kontakte";
let myFeld := text(Auswahlfeld);
let myAktuellerName := eval("text(" + myFeld + ")", this);
cnt(eval("select " + myTabelle + " where " + myFeld + " = " + myAktuellerName, this))
```

Gibt die Anzahl der Datensätze in der Tabelle "Kontakte" zurück, deren Feld "Vollständiger Name" dem gewählten Feldwert im aktuellen Datensatz entspricht. Nutze diesen Ansatz für dynamische Duplikatsuchen, wenn `myFeld` aus einem Auswahlfeld stammt.

## App-Kontext und Datenbankstatus erkennen

Nutze diese Funktionen, wenn dein Skript auf den aktuellen Client oder den Schutzstatus der Datenbank reagieren soll.

### Mit `ninoxApp()` die aktuelle App erkennen <a href="#inspect-the-app-context" id="inspect-the-app-context"></a>

Nutze `ninoxApp()`, um zu prüfen, wo dein Skript ausgeführt wird.

Nutze es, wenn du:

* Verhalten je nach Client anpassen willst.
* client-spezifische Workflows diagnostizieren willst.

`ninoxApp()`

`ninoxApp()` gibt einen String zurück, der die aktuelle Umgebung kennzeichnet.

Mögliche Rückgabewerte sind:

* `client`
* `server`

#### Schauen wir uns einige Beispiele an:

```ninox
ninoxApp() = "client"
```

Gibt einen String zurück, der zeigt, wo das Skript läuft.

Tipps:

* Nutze `ninoxApp()`, um zu prüfen, ob UI-Funktionen ausgeführt werden können. Das ist nicht der Fall, wenn das Ergebnis `server` ist.

## Nutze Ninox AI, um Aufgaben mit `aiPrompt()` auszuführen <a href="#aufgaben-mit-aiprompt-und-ninox-ai-ausfuhren" id="aufgaben-mit-aiprompt-und-ninox-ai-ausfuhren"></a>

Nutze `aiPrompt()`, um Daten mit einer Anweisung an Ninox AI zu senden. Die Funktion gibt ein JSON-Objekt mit den in `format` definierten Feldern und Typen zurück. Nutze sie, um Texte zu klassifizieren, Werte zu extrahieren oder Felder automatisch auszufüllen.

`aiPrompt(input, prompt, format)`

* `input` der Text, das Feld, JSON-Objekt oder die Liste von Objekten, die Ninox AI verarbeiten soll
* `prompt` die Anweisung für Ninox AI
* `format` ein JSON-Objekt, das die zurückgegebenen Felder und deren Typen definiert

Verwende `"string"`, `"number"`, `"boolean"` oder `"date"` als Feldtyp. Du kannst auch eine Liste von Textwerten angeben, wenn Ninox AI eine Option auswählen soll. Verwende nach Möglichkeit bis zu sieben Felder. Ein Datum wird als Text im Format `YYYY-MM-DD` zurückgegeben. Verwende `date()`, um es in einen Datumswert umzuwandeln.

Lies das Ergebnis in `format` mit `r.field`, `item(r, "field")` oder `for key, value in r do … end`.

Die folgenden Limits gelten:

* `format` Felder: maximal 20. Verwende nach Möglichkeit 1-7.
* Optionen pro Liste: 2-50. Verwende nach Möglichkeit bis zu 10.
* Feldnamen: nur Buchstaben, Ziffern und `_`. Beginne mit einem Buchstaben. `error` ist reserviert.
* Größe von `input`: maximal 20.000 Zeichen
* Timeout: 60 Sekunden
* AI-Aufrufe pro Skriptausführung: maximal 50

{% hint style="info" %}
In Triggern musst du `aiPrompt()` innerhalb von `do as deferred` verwenden. Die Funktion ist nicht in Logikfeldern oder in `do as transaction` verfügbar.
{% endhint %}

#### Schauen wir uns einige Beispiele an:

```ninox
let r := aiPrompt(nachricht, "Wähle eine Kategorie und Priorität.", {
    kategorie: ["Bug", "Frage", "Funktionsvorschlag"],
    prioritaet: ["Hoch", "Mittel", "Niedrig"]
});
if r.error then
    alert(r.error)
else
    kategorie := r.kategorie;
    prioritaet := r.prioritaet
end
```

Klassifiziert ein Support-Ticket und füllt die Felder für Kategorie und Priorität aus.

```ninox
let r := aiPrompt(email_text, "Ermittle die Anzahl der Lizenzen und das Startdatum.", {
    lizenzen: "number",
    startDatum: "date"
});
if not r.error then
    lizenzen := r.lizenzen;
    start_datum := date(r.startDatum);
    total_price := r.lizenzen * preis_pro_lizenz
end
```

Extrahiert eine Zahl und ein Datum aus einer E-Mail. Die zurückgegebene Zahl kannst du in Berechnungen verwenden.

### Mehrere Datensätze verarbeiten

Du kannst `aiPrompt()` einmal pro Datensatz oder einmal für eine Gruppe von Datensätzen aufrufen. Wähle den Ansatz anhand des benötigten Ergebnisses.

Rufe die Funktion einmal pro Datensatz auf, wenn du für jeden Datensatz ein Feld ausfüllen musst. Dieses Beispiel klassifiziert jeden Datensatz in der Tabelle "Tickets":

```ninox
for t in select Tickets do
    let r := aiPrompt(t.nachricht, "Klassifiziert das Ticket.", {
        kategorie: ["Bug", "Frage", "Funktionsvorschlag"]
    });
    if not r.error then
        t.kategorie := r.kategorie
    end
end
```

Fünf Datensätze führen zu fünf AI-Aufrufen. Jeder Datensatz erhält eine eigene Kategorie.

Rufe die Funktion einmal für alle Datensätze auf, wenn du eine Übersicht oder einen Bericht für mehrere Datensätze benötigst. Dieses Beispiel sendet alle Titel und Nachrichten der Tickets in einem AI-Aufruf:

```ninox
let myDaten := for t in select Tickets do
    {titel: t.titel, nachricht: t.nachricht}
end;
let r := aiPrompt(data, "Was ist das häufigste Problem?", {
    problem: "string",
    empfehlung: "string"
});
if not r.error then
    alert(r.problem + " – " + r.empfehlung)
end
```

Fünf Datensätze führen zu einem AI-Aufruf. Dieser Ansatz ist schneller und verbraucht weniger AI-Credits.

{% hint style="info" %}
Rufe `aiPrompt()` einmal pro Datensatz auf, wenn jeder Datensatz ein eigenes Ergebnis benötigt. Dieser Ansatz füllt Felder, aber fünf Datensätze erfordern fünf AI-Aufrufe.\
\
Rufe `aiPrompt()` einmal für alle Datensätze auf, wenn du ein gemeinsames Ergebnis benötigst. Dieser Ansatz eignet sich für Übersichten und Berichte. Fünf Datensätze erfordern einen AI-Aufruf.
{% endhint %}

Tipps:

* Jeder AI-Aufruf verbraucht AI-Credits.
* Sende nur notwendige Daten an Ninox AI.
* Inhalte von Prompts, Eingaben und Nachrichten werden nicht protokolliert.
* Das Ergebnis enthält die in `format` definierten Felder. Unbekannte Werte sind `null`.
* Bei einem Fehler gibt die Funktion `{error: "message"}` zurück. Prüfe `r.error`, bevor du das Ergebnis verwendest.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ninox.com/ninox-scripting/de/automate-your-workflows/work-with-functions/system-flow-control-and-ai.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
