# Reiter „Spalten“

Die Spaltenliste ist die ganze Schnittstelle einer Definition: **eine Spalte, die hier
nicht steht, wird nicht geliefert**, lässt sich nicht filtern, sortieren oder
durchsuchen und wird beim Anlegen und Ändern abgewiesen – gleich, was in der
SQL-Tabelle steht.

Links die Liste der deklarierten Spalten, rechts das Formular zur ausgewählten.

## Die Leiste über der Liste

| Knopf | Wirkung |
|---|---|
| **+ Spalte** | hängt eine leere Spalte vom Typ `text` an |
| **+ aus Tabelle …** | übernimmt Spalten aus dem gelesenen Tabellenaufbau (siehe unten) |
| **↑ / ↓** | verschiebt die ausgewählte Spalte; die Reihenfolge ist die der Anzeige |
| **Kopie** | legt eine Kopie mit dem Zusatz `_Kopie` direkt darunter an |
| **Entfernen** | nimmt die Spalte aus der Definition – die SQL-Tabelle bleibt unberührt |

In der Liste steht hinter dem Namen der `meta.type`. Ein **⚿** kennzeichnet den
Primärschlüssel. Eine hervorgehobene Zeile heißt: diese Spalte gibt es in der
SQL-Tabelle nicht – der Router lässt sie aus jeder Antwort weg.

Ein **leerer Eintrag** entsteht durch ein Loch in der JSON-Liste
(`[ {…}, , {…} ]`). Der Router übergeht ihn, das Speichern entfernt ihn.

## + aus Tabelle …

Zeigt alle Spalten der SQL-Tabelle, die noch nicht deklariert sind, mit SQL-Typ,
Schlüssel- und Pflichtkennzeichen. Angehakte werden übernommen, und der Editor schlägt
dabei gleich etwas vor:

* Primärschlüssel → `meta.type = key`, nicht sichtbar
* Spalte `Licence` → `meta.type = licence`, nicht sichtbar
* `bit` → `checkbox`, `int` → `int`, `decimal` → `number`, `date` → `date`,
  `datetime` → `datetime`, alles andere → `text` mit Suchfeld
* Datums- und Zeitspalten mit Standardwert sowie hochgezählte Spalten werden beim
  Anlegen nicht änderbar
* `Principal` und `CompanyCode` bekommen die **Firmenliste** aus der Tabelle
  `principal` als Werteliste vorgeschlagen – bei `CompanyCode` mit dem Standardwert
  `ANY`. Liegt die Definition nicht selbst in `DEX_MasterData`, wird die Verbindung
  dorthin gleich mit eingetragen

Alle Vorschläge lassen sich danach ändern.

## Das Formular einer Spalte

Ist der Tabellenaufbau gelesen, steht oben eine Zeile dazu, was die Datenbank über
diese Spalte sagt: Typ und Länge, Primärschlüssel, hochgezählt, NULL oder NOT NULL,
Standardwert und ob sie beim Anlegen Pflicht ist.

| Feld | Eigenschaft | Bedeutung |
|---|---|---|
| **Name** | `name` | Der SQL-Spaltenname. Er ist der Schlüssel in den Zeilen und beim Schreiben. Pflichtfeld |
| **Beschriftung** | `label` | Fehlt sie, zeigt der Client den Namen |
| **SQL-Typ** *(nur View)* | `type` | Views werden nicht ausgelesen – der Typ kommt von hier. Ohne ihn meldet die API `string` |
| **Typ** | `meta.type` | `text`, `int`, `number`, `date`, `datetime`, `checkbox`, `list`, `multiplelist`, `combobox`, `comboboxText`, `popup`, `iconorlist`, `key`, `licence`, `hidden`. `key` und `licence` sind die technischen Spalten, `hidden` lässt die Spalte in der API, aber nicht im Formular |
| **Sichtbar** | `meta.show` | *nein* blendet die Spalte in der Liste aus |
| **Standardwert** | `meta.defaultValue` | Wird beim Anlegen vorbelegt. Als Text, Zahl, *ja*, *nein* oder *leer (null)* |
| **Suchfeld** | `meta.searchAutocomplete` | Nimmt die Spalte in die Suche der Autovervollständigung auf |
| **Werteliste** | – | Woher die Auswahl kommt (siehe unten) |

## Werteliste

Vier Wege, die einander ausschließen. Der Client wertet sie in dieser Reihenfolge aus:
`possibleValues` vor `meta.listScript` vor `meta.listItems`.

| Auswahl | Was passiert |
|---|---|
| **keine** | freies Feld |
| **feste Liste** | Die Einträge stehen als `meta.listItems` in der Definition selbst – der Weg, den der DEX-Client für eine feste Auswahl kennt. Je Eintrag `key` (gespeicherter Wert) und `label` (angezeigter Text). Einträge ohne beides lässt der Client weg |
| **aus einem Skript** | `meta.listScript` nennt ein Portalskript; der Client ruft es über `dex_callScript` auf und erwartet eine JSON-Zeichenkette mit `{ value, label }`. Darunter stehen die `meta.listScriptParams` als Name-Wert-Liste – DOCUMENTS übergibt sie als Text |
| **aus anderer Tabelle** | Nachgeschlagen in einer Tabelle, geliefert unter `/table/<Definition>/col/<Spalte>/possibleValues` |
| *feste Liste in `possibleValues`* | Erscheint nur, wenn eine Definition sie schon mitbringt. Die API liefert sie, der DEX-Client zeigt sie **nicht**. Der Knopf *In feste Liste übernehmen* macht `meta.listItems` daraus |

Für *aus anderer Tabelle*:

| Feld | Bedeutung |
|---|---|
| **Verbindung der Liste** | leer lassen, wenn die Tabelle in derselben Datenbank liegt wie die Definition |
| **Tabelle der Liste** | Pflichtfeld – fehlt sie, endet der Aufruf mit 404 |
| **Wertespalte** | die Spalte, deren Werte angeboten werden. Pflichtfeld |
| **Anzeige** | Vorlage für den angezeigten Text, `{{Spaltenname}}` wird je Zeile ersetzt |
| **Schema / Katalog** *(erweitert)* | MySQL: `schema` = Datenbankname, `catalog` = `def`. MS SQL: `schema` = `dbo`, `catalog` = Datenbankname |
| **WHERE-Bedingung der Liste** *(erweitert)* | schränkt die Liste ein |
| **Wertespalte darf der Client wählen** *(erweitert)* | `valueColumnByClient` |

## Übersetzungsfilter

`meta.translationFilter` sagt, wo die Übersetzungen der Liste stehen: **Application**,
**PropType** und **PropTypeSubCategory** bilden einen festen Filter auf die
Übersetzungstabelle. Aneinandergehängt sind sie zugleich der Namensraum, unter dem der
Client die geladene Liste behält – zwei Spalten mit demselben Filter teilen sie sich.
Ohne Filter bleiben die Beschriftungen unübersetzt.

Der Filter gilt für alle drei Listenarten: feste Einträge, Einträge aus einem Skript
und die Beschriftungen einer nachgeschlagenen Liste.

## Erweitert

| Feld | Eigenschaft | Bedeutung |
|---|---|---|
| Pflichtfeld | `mandatory` | Vorgabe entscheidet die Datenbank (NOT NULL, kein Standardwert, keine Identity) |
| Beim Anlegen änderbar | `editableOnInsert` | *nein* blendet das Feld schreibgeschützt ein; Pflichtspalten bleiben änderbar |
| Beim Ändern änderbar | `editableOnUpdate` | Primärschlüssel sind *nein*, solange hier nichts anderes steht |
| meta.label | `meta.label` | überschreibt die Beschriftung im DEX-Tabellenclient |
| Breite | `meta.layout` | Breite des Eingabefelds im Raster, 1 bis 12 |
| Änderbar / Pflicht im Client / „ANY“ anbieten | `meta.editable`, `meta.mandatory`, `meta.addAny` | Verhalten im Client |
| Listenformat | `meta.listFormat` | z. B. `%value% (%label%)` |
| Unbekannten Wert zeigen | `meta.showValueNotFound` | zeigt einen gespeicherten Wert, den es in der Liste nicht mehr gibt |
| Technischen Wert zeigen | `meta.showTechnicalNameInList` | |
| Übersetzungsvorsatz | `meta.translationPrefix` | wird den nachgeschlagenen Schlüsseln vorangestellt; ohne Übersetzungsfilter wirkungslos |
| Liste immer neu laden | `meta.alwaysLoadList` | nötig, wenn zwei Spalten denselben Filter, aber verschiedene Werte haben |
| Weitere meta-Eigenschaften (JSON) | – | z. B. `listFilter`, `iconName`, `width` – bleiben erhalten |
| Weitere Eigenschaften der Spalte (JSON) | – | bleiben erhalten |