# Ausdrücke

Mit Ausdrücken können Sie komplexe Logik direkt schreiben, statt den visuellen Editor zu verwenden. Das bietet maximale Flexibilität – erfordert aber etwas Erfahrung.

## Was sind Ausdrücke?

Ausdrücke sind kurze Formeln, die einen Wahrheitswert ergeben: Wahr oder Falsch.

**Beispiel:**

```
alter >= 18
```

Dieser Ausdruck ist **wahr**, wenn das Alter 18 oder höher ist, und **falsch**, wenn es darunter liegt.

## Wann Ausdrücke verwenden?

**✅ Verwenden Sie Ausdrücke für:**

* Komplexe Logik mit vielen Bedingungen
* Mathematische Berechnungen
* Mustervergleiche (Regex)
* Funktionen wie `heute()` oder `size()`
* Wenn Sie Erfahrung mit Programmierung haben

**⚠️ Nutzen Sie den visuellen Editor für:**

* Einfache Bedingungen (1-3 Vergleiche)
* Wenn Sie keine Programmiererfahrung haben
* Schnelle, übersichtliche Bedingungen

→ [Visueller Bedingungseditor](/formulare/erweitert/bedingungseditor.md)

## Die Sprache: CEL

Ausdrücke werden in der **Common Expression Language (CEL)** geschrieben. Das ist eine einfache Ausdruckssprache ähnlich wie JavaScript oder Python.

{% hint style="info" %}
**Keine Sorge:** Sie müssen nicht programmieren können. Die Grundlagen sind schnell gelernt, und wir zeigen Ihnen viele Beispiele.
{% endhint %}

## Grundlegende Syntax

### Vergleiche

| Operator | Bedeutung           | Beispiel      | Ergebnis                              |
| -------- | ------------------- | ------------- | ------------------------------------- |
| `==`     | gleich              | `alter == 18` | Wahr, wenn Alter genau 18 ist         |
| `!=`     | ungleich            | `alter != 18` | Wahr, wenn Alter nicht 18 ist         |
| `>`      | größer als          | `alter > 18`  | Wahr, wenn Alter über 18 ist          |
| `<`      | kleiner als         | `alter < 18`  | Wahr, wenn Alter unter 18 ist         |
| `>=`     | größer oder gleich  | `alter >= 18` | Wahr, wenn Alter 18 oder höher ist    |
| `<=`     | kleiner oder gleich | `alter <= 18` | Wahr, wenn Alter 18 oder darunter ist |

***

### Logische Verknüpfungen

| Operator | Bedeutung                             | Beispiel                                   |
| -------- | ------------------------------------- | ------------------------------------------ |
| `&&`     | UND (beide müssen wahr sein)          | `alter >= 18 && wohnort == 'Berlin'`       |
| `\|\|`   | ODER (mindestens eins muss wahr sein) | `alter < 18 \|\| student == true`          |
| `!`      | NICHT (kehrt den Wert um)             | `!(alter < 18)` (entspricht `alter >= 18`) |

***

### Texte (Strings)

Texte müssen in **einfache Anführungszeichen** gesetzt werden:

```
antragsteller == 'Unternehmen'
```

**Nicht verwenden:** "Unternehmen" (doppelte Anführungszeichen)

***

### Zahlen

Zahlen werden ohne Anführungszeichen geschrieben:

```
alter >= 18
umsatz < 500000
```

***

### Felder referenzieren

Feldnamen werden **klein geschrieben** und **ohne Anführungszeichen**:

```
alter
antragsteller
firmename
```

**Wichtig:** Verwenden Sie den internen Feldnamen, nicht den Titel. Den internen Namen sehen Sie im Konfigurationsmenü unter "Allgemein" → "Name".

## Häufige Ausdrücke und Funktionen

| Anwendungsfall          | Ausdruck                                                              | Erklärung                                   |
| ----------------------- | --------------------------------------------------------------------- | ------------------------------------------- |
| **Einfacher Vergleich** | `antragsteller == 'Unternehmen'`                                      | Feld entspricht einem Wert                  |
| **UND-Verknüpfung**     | `antragsteller == 'Unternehmen' && umsatz < 500000`                   | Beide Bedingungen müssen erfüllt sein       |
| **ODER-Verknüpfung**    | `alter < 18 \|\| student == true`                                     | Mindestens eine Bedingung muss erfüllt sein |
| **Zahlenbereich**       | `alter >= 18 && alter <= 65`                                          | Wert muss in Bereich liegen                 |
| **Feld ausgefüllt**     | `size(telefon) > 0`                                                   | Feld ist nicht leer                         |
| **Text enthält**        | `kommentar.contains('dringend')`                                      | Text enthält bestimmtes Wort                |
| **Text beginnt/endet**  | `postleitzahl.startsWith('10')` oder `email.endsWith('@example.com')` | Text-Muster am Anfang/Ende prüfen           |
| **Regex-Muster**        | `postleitzahl.matches('[0-9]{5}')`                                    | Komplexe Musterprüfung                      |
| **Datum vergleichen**   | `geburtsdatum < today()`                                              | Datum in Vergangenheit                      |

## Datum und Zeit

**Wichtigste Funktionen:**

* `today()` – Heutiges Datum
* `duration('18y')` – Zeitdauer (z.B. '18y' = 18 Jahre, '30d' = 30 Tage)

**Beispiele:**

```
geburtsdatum < today()  // Vergangenheit
veranstaltungsdatum > today()  // Zukunft
startdatum < enddatum  // Datumsvergleich
geburtsdatum < today() - duration('18y')  // Mindestens 18 Jahre alt
```

## Mathematische Operationen

| Operator | Bedeutung      | Beispiel                             |
| -------- | -------------- | ------------------------------------ |
| `+`      | Addition       | `umsatz + gewinn`                    |
| `-`      | Subtraktion    | `umsatz - kosten`                    |
| `*`      | Multiplikation | `umsatz * 0.19` (19% Mehrwertsteuer) |
| `/`      | Division       | `umsatz / 12` (Monatsumsatz)         |
| `%`      | Modulo (Rest)  | `alter % 2 == 0` (gerade Zahl)       |

**Beispiele:**

```
umsatz * 0.19 < 10000
```

(19% des Umsatzes sind weniger als 10.000 Euro)

```
mitarbeiter / bereich > 10
```

(Mehr als 10 Mitarbeiter pro Bereich)

## Reguläre Ausdrücke (Regex)

**Wichtigste Zeichen:** `[0-9]` = Ziffer, `[a-z]` = Buchstabe, `{5}` = genau 5-mal, `+` = eines oder mehr, `\\` = Sonderzeichen maskieren, `|` = oder

**Häufige Beispiele:**

```
postleitzahl.matches('[0-9]{5}')  // 5 Ziffern
telefon.matches('(\\+49|0)[0-9\\s\\-]{9,}')  // Deutsche Telefonnummer
iban.matches('DE[0-9]{20}')  // Deutsche IBAN
email.matches('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}')  // E-Mail
```

→ Ausführliche Regex-Referenz: [Validierungsregeln](/formulare/erweitert/validierung.md)

## Klammern für Priorität

Verwenden Sie Klammern bei UND/ODER-Kombinationen:

```
alter >= 18 && (wohnort == 'Berlin' || wohnort == 'Hamburg')
```

(Alter 18+ UND Wohnort Berlin oder Hamburg)

```
(antragsteller == 'Unternehmen' && umsatz < 500000) || (antragsteller == 'Freiberufler' && umsatz < 100000)
```

(Kleine Unternehmen ODER kleine Freiberufler)

## Komplexe Beispiele

**Zusatzförderung für kleine Unternehmen:**

```
antragsteller == 'Unternehmen' && mitarbeiter < 50 && umsatz < 10000000
```

**Ermäßigung für bestimmte Gruppen:**

```
status == 'Schüler' || status == 'Student' || alter >= 65
```

**Regionale Förderung mit PLZ-Prüfung:**

```
bundesland == 'Berlin' && postleitzahl.matches('1[0-4][0-9]{3}')
```

(Berlin-Förderung nur für Berliner PLZ 10xxx-14xxx)

## Fehlerbehebung

**"Ungültiger Ausdruck":**

* Verwenden Sie `'` statt `"` für Texte
* Prüfen Sie Feldnamen (exakte Schreibweise!)
* Prüfen Sie Klammern (jede öffnende braucht eine schließende)

**"Feld nicht gefunden":**

* Verwenden Sie den internen Feldnamen (siehe Konfigurationsmenü)
* Das Feld muss vor dem aktuellen Feld im Formular stehen

**Bedingung funktioniert nicht:**

* Testen Sie Teile einzeln
* Fügen Sie Klammern bei UND/ODER hinzu
* Prüfen Sie Werte auf exakte Übereinstimmung

**Regex funktioniert nicht:**

* Sonderzeichen maskieren: `.` → `\\.`, `+` → `\\+`, `-` → `\\-`

## Testen und Best Practices

**Testen Sie immer:** Speichern → Vorschau → verschiedene Szenarien durchspielen (erfüllt, nicht erfüllt, Grenzfälle, leere Felder)

**✅ Empfohlen:** Einfach starten und schrittweise erweitern, Klammern bei UND/ODER setzen, komplexe Logik dokumentieren, internen Feldnamen verwenden

**❌ Vermeiden:** Mehr als 5-6 Bedingungen verketten, doppelte Anführungszeichen (`"text"`), fehlende Klammern, spätes Testen

## Vom visuellen Editor zu Ausdrücken

Sie können jederzeit vom visuellen Editor zu Ausdrücken wechseln:

1. Öffnen Sie die Bedingung im visuellen Editor
2. Klicken Sie auf **"Als Code bearbeiten"**
3. Der Ausdruck wird generiert (z.B. `antragsteller == 'Unternehmen'`)
4. Sie können ihn jetzt manuell erweitern

{% hint style="warning" %}
**Achtung:** Nach dem Wechsel zu Ausdrücken können Sie **nicht mehr** zum visuellen Editor zurück! Überlegen Sie vorher, ob Sie wirklich wechseln möchten.
{% endhint %}

## Weitere Hilfe

**→** [**Bedingungen verstehen**](/formulare/erweitert/bedingungen.md) – Grundlagen und Anwendungsfälle

**→** [**Visueller Bedingungseditor**](/formulare/erweitert/bedingungseditor.md) – Bedingungen ohne Programmierung

**→** [**Validierungsregeln**](/formulare/erweitert/validierung.md) – Ausdrücke für Eingabeprüfungen

**→** [**Feldtypen**](/formulare/erstellen/feldtypen.md) – Welche Felder können in Ausdrücken verwendet werden?

## Referenz: Alle Operatoren und Funktionen

### Vergleichsoperatoren

| Operator | Bedeutung           |
| -------- | ------------------- |
| `==`     | gleich              |
| `!=`     | ungleich            |
| `>`      | größer als          |
| `<`      | kleiner als         |
| `>=`     | größer oder gleich  |
| `<=`     | kleiner oder gleich |

### Logische Operatoren

| Operator | Bedeutung |
| -------- | --------- |
| `&&`     | UND       |
| `\|\|`   | ODER      |
| `!`      | NICHT     |

### Mathematische Operatoren

| Operator | Bedeutung      |
| -------- | -------------- |
| `+`      | Addition       |
| `-`      | Subtraktion    |
| `*`      | Multiplikation |
| `/`      | Division       |
| `%`      | Modulo (Rest)  |

### String-Funktionen

| Funktion                  | Bedeutung         |
| ------------------------- | ----------------- |
| `size(feld)`              | Länge des Textes  |
| `feld.contains('text')`   | Enthält Text      |
| `feld.startsWith('text')` | Beginnt mit       |
| `feld.endsWith('text')`   | Endet mit         |
| `feld.matches('regex')`   | Entspricht Muster |

### Datum-Funktionen

| Funktion          | Bedeutung                       |
| ----------------- | ------------------------------- |
| `today()`         | Heutiges Datum                  |
| `duration('18y')` | Zeitdauer (Jahre, Monate, Tage) |

### Sonstige

| Funktion | Bedeutung             |
| -------- | --------------------- |
| `null`   | Leerer/Fehlender Wert |
| `''`     | Leerer String         |


---

# 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.polyteia.com/formulare/erweitert/ausdruecke.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.
