5.4 Berechnete Felder — Aggregationen und Rollups konfigurieren

5.4 Berechnete Felder — Aggregationen und Rollups konfigurieren

Anleitung zur Einrichtung von berechneten Feldern (Computed Fields) für deklarative Aggregationen über verknüpfte Datensätze im UDM Admin Client.

1

Überblick

Berechnete Felder (Computed Fields) ermöglichen deklarative Aggregationen über verknüpfte Datensätze: COUNT, SUM, AVG, MIN, MAX, EXISTS und ConcatDistinct. Sie berechnen beispielsweise „Anzahl offener Vorgänge pro Kunde“ automatisch — ohne dynamischen C#-Code.

Berechnete Felder ergänzen bestehende Konzepte wie Joins (liefern Einzelspalten aus 1:1-Beziehungen) und Spaltenanreicherungen (transformieren vorhandene Werte). Im Gegensatz dazu liefern berechnete Felder einen aggregierten Skalarwert über eine 1:n-Beziehung.

Echtzeit-Berechnung Berechnete Felder werden bei jedem Datenabruf in Echtzeit als SQL-Unterabfrage ausgeführt. Es gibt keinen periodischen Rollup-Lauf — die Werte sind immer aktuell. Bei gecachten Datenquellen profitieren sie vom bestehenden Caching.
Szenario: Offene Vorgänge pro Kunde zählen Sie möchten in einer Kundenliste automatisch anzeigen, wie viele offene Vorgänge jedem Kunden zugeordnet sind. Dafür legen Sie ein berechnetes Feld an, das COUNT(Vorgänge WHERE Status=Offen) am Kundendatensatz berechnet. Das Ergebnis erscheint als zusätzliche Spalte in der Datenquelle — ohne eine Zeile Code.
2

Schritt-für-Schritt-Anleitung

  1. Berechnetes Feld am Datenobjekt anlegen

    Navigieren Sie im Admin-Bereich zur gewünschten Datenquelle und wechseln Sie zum Tab „Ausgabespalten“. Klicken Sie in der Toolbar auf den Button „Berechnete Spalte“ (Taschenrechner-Symbol). Es wird ein neues, ungebundenes Feld angelegt und die Konfiguration öffnet sich automatisch.

  2. Aggregationstyp wählen

    Wählen Sie im Konfigurationsdialog den gewünschten Aggregationstyp aus der Dropdown-Liste. Die verfügbaren Typen finden Sie in der Tabelle weiter unten. Bei COUNT und EXISTS ist kein Aggregationsfeld erforderlich.

  3. Quell-Entity und Schlüsselfelder definieren

    Konfigurieren Sie die Beziehung zum Ziel-Objekt:

    Feld Beschreibung
    Ziel-Objekt Pflicht Das verknüpfte Objekt, über das aggregiert wird (z. B. „Vorgang“, „Position“)
    Lokales Schlüsselfeld Pflicht Das Feld im aktuellen Objekt, das die Verknüpfung herstellt (z. B. KundeId)
    Fremd-Schlüsselfeld Pflicht Das Feld im Ziel-Objekt, das den Fremdschlüssel enthält (z. B. KundeId)
    Aggregationsfeld Optional Das Feld im Ziel-Objekt, auf das die Aggregation angewendet wird (bei SUM, AVG, MIN, MAX, ConcatDistinct erforderlich)
  4. Filterbedingung setzen (optional)

    Um nur bestimmte verknüpfte Datensätze in die Aggregation einzubeziehen, fügen Sie eine Filterbedingung hinzu. Sie können mehrere Filterregeln kombinieren (z. B. Status = Offen und Typ ≠ Intern). Die Filter nutzen die bestehende UDM-Filter-Infrastruktur (UdmFilterGroup).

  5. Feld in Datenquelle/Dialog einbinden

    Passen Sie im Grid Ausgabename, Titel und Datentyp an. Speichern Sie die Datenquelle. Das berechnete Feld steht nun in Ansichtselementen und Dialogen zur Verfügung und wird bei jeder Datenabfrage automatisch befüllt.

Datenquelle → Berechnetes Feld konfigurieren
Berechnetes Feld
Ausgabename
AnzahlAuftraege
Titel
Aufträge
Datentyp
Integer
Aggregation
Funktion
COUNT
Ziel-Datenquelle
DS_Auftraege
Beziehungsfeld
KundenId
Filter
Status = 'offen'
3

Aggregationstypen im Überblick

Typ Beschreibung Aggregationsfeld Beispiel
COUNT Zählt die Anzahl der verknüpften Datensätze Nicht erforderlich Anzahl Aufgaben pro Projekt
SUM Bildet die Summe eines numerischen Feldes Pflicht Gesamtbetrag aller Rechnungspositionen
AVG Berechnet den Durchschnitt eines numerischen Feldes Pflicht Durchschnittliche Bewertung
MIN Ermittelt den kleinsten Wert Pflicht Frühestes Startdatum
MAX Ermittelt den größten Wert Pflicht Letzte Aktivität (jüngstes Datum)
EXISTS Prüft, ob mindestens ein verknüpfter Datensatz existiert Nicht erforderlich Hat Anhänge? (true/false)
ConcatDistinct Listet eindeutige Werte kommasepariert auf Pflicht Zugewiesene Tags: „Dringend, Review, Extern“
4

Aggregation über eine Weitere Datenquelle

Neben der direkten Aggregation über ein Datenobjekt (Entity) können Sie auch eine „Weitere Datenquelle“ als Aggregationsquelle verwenden. Dies ist besonders nützlich, wenn die Zuordnungsdaten nicht direkt in einer Entity-Tabelle liegen, sondern in einer konfigurierten Datenquelle mit eigenen Joins, Filtern und Anreicherungen.

Szenario: Zugewiesene Maßnahmen auflisten Ihre Datenquelle „Meldungen“ soll eine Spalte „Maßnahmen“ anzeigen, die alle zugeordneten Maßnahmennamen kommasepariert auflistet. Die Maßnahmenzuordnung liegt in einer separaten Datenquelle „BM Maßnahmen Zuordnung“, die bereits als „Weitere Datenquelle“ konfiguriert ist.
  1. Weitere Datenquelle einrichten

    Stellen Sie sicher, dass die Zuordnungstabelle als „Weitere Datenquelle“ im Tab „Weitere Datenquellen“ der Hauptdatenquelle konfiguriert ist.

  2. Berechnete Spalte anlegen

    Wechseln Sie zum Tab „Ausgabespalten“ und klicken Sie auf „Berechnete Spalte“.

  3. Datenquelle statt Entity wählen

    Im Konfigurationsbereich der Aggregation sehen Sie zwei Felder: „Verwandte Entity“ und „Datenquelle“. Lassen Sie das Entity-Feld leer und wählen Sie stattdessen die gewünschte „Weitere Datenquelle“ im Dropdown „Datenquelle“.

  4. Schlüsselfelder und Aggregation konfigurieren

    Konfigurieren Sie wie gewohnt das lokale Schlüsselfeld, das Fremd-Schlüsselfeld und den Aggregationstyp (z. B. STRING_AGG — Verketten). Die Feldliste im Dropdown stammt aus den Ausgabespalten der gewählten Datenquelle.

Performance-Hinweis Bei der Datenquellen-Variante werden die Daten der „Weiteren Datenquelle“ komplett in den Speicher geladen (In-Memory-Aggregation per LINQ). Für Zuordnungstabellen mit wenigen tausend Datensätzen ist das unproblematisch. Bei sehr großen Datenmengen (> 50.000 Zeilen) sollten Sie die Entity-Variante bevorzugen, die serverseitig per SQL aggregiert.
Eigenschaft Entity-Modus Datenquellen-Modus
Datenermittlung SQL-Abfrage mit GROUP BY In-Memory (LINQ)
Datenübertragung Nur aggregierte Ergebnisse Komplette Datenquelle
Joins & Filter Nur Rohdaten der Entity Datenquelle inkl. Joins, Filter, Anreicherungen
Empfohlen für Große Tabellen, einfache Aggregation Zuordnungstabellen, aufbereitete Daten
Grid-Vorschau → berechnete Spalte »Aufträge« und »Umsatz«
KundeBrancheAufträgeUmsatzLetzter Kontakt
Mustermann GmbHIT7€ 84.20002.05.2026
Beispiel AGHandel3€ 12.45028.04.2026
Demo KGIndustrie12€ 51.64030.04.2026
5

Abgrenzung zu bestehenden Funktionen

Funktion Zweck Datenherkunft
Spaltenanreicherung Werte transformieren (Format, Ersetzung, Ausdruck) Gleiches Feld / gleiche Zeile
Berechnete Felder Werte aggregieren aus verknüpften Tabellen Andere Entity / 1:n-Beziehung
Joins Einzelne Spalten aus verknüpften Tabellen einblenden 1:1- oder n:1-Beziehung
Dynamischer Code Beliebige Logik per C#-Code Alles möglich
Tipp: Kombination möglich Berechnete Felder, Spaltenanreicherungen und dynamischer Code können kombiniert werden. Die Verarbeitungsreihenfolge ist: Spaltenanreicherungen → Berechnete Felder → Dynamischer Code. So kann dynamischer Code auch auf berechnete Felder zugreifen.
Hinweis: Formatierung Die Felder Anzeigeformat und Anzeige bei leer werden serverseitig nicht auf den Datenwert angewendet, um die Sortierung und Typisierung zu erhalten. Formatierungen erfolgen ausschließlich auf der Client-Seite (z. B. im DataGrid-Spaltenformat). Der Server speichert immer den typisierten Wert.
6

Häufige Fragen

Welche Beziehung muss zwischen den Objekten bestehen?

Es muss eine 1:n-Beziehung über ein gemeinsames Schlüsselfeld bestehen. Das lokale Schlüsselfeld (z. B. KundeId) im Hauptobjekt wird mit dem gleichnamigen Fremdschlüssel im Ziel-Objekt verknüpft. Eine formale Beziehungsdefinition in UDM ist nicht erforderlich — die Felder müssen lediglich inhaltlich übereinstimmen.

Was passiert, wenn das Ziel-Objekt nicht gefunden wird?

Kann die verwandte Entity nicht aufgelöst werden, wird eine Warnung in der Admin-Vorschau angezeigt. Die übrigen Spalten der Datenquelle bleiben unberührt — es tritt kein harter Fehler auf.

Werden Aggregationen bei jeder Abfrage neu berechnet?

Ja. Berechnete Felder werden bei jedem Datenabruf als SQL-Batch-Abfrage ausgeführt. Bei gecachten Datenquellen (IsCached) wird das Ergebnis inklusive der berechneten Werte gecacht.

Wie viele berechnete Felder kann ich pro Datenquelle anlegen?

Es gibt kein festes Limit. Pro berechnetem Feld wird eine zusätzliche SQL-Abfrage ausgeführt (Batch-Verfahren, kein N+1-Problem). Bei mehr als fünf berechneten Feldern empfiehlt es sich, die Performance in der Vorschau zu prüfen.

Kann ich berechnete Felder auch auf Ansichtselement-Ebene anlegen?

Ja. Der Button „Berechnete Spalte“ ist sowohl in Datenquellen als auch in Ansichtselementen im Tab „Ausgabespalten“ verfügbar.

Was ist der Unterschied zwischen „Neues Feld“ und „Berechnete Spalte“?

Neues Feld erstellt eine leere, ungebundene Spalte ohne Vorkonfiguration (kann per dynamischem Code befüllt werden). Berechnete Spalte erstellt ebenfalls ein ungebundenes Feld, legt aber automatisch eine Aggregationsregel an und öffnet die Konfiguration.

Wann sollte ich Entity vs. Datenquelle als Aggregationsquelle wählen?

Verwenden Sie Entity, wenn die Rohdaten der Zieltabelle ausreichen und es sich um große Datenmengen handelt (effiziente SQL-Aggregation). Verwenden Sie Datenquelle, wenn die Zieldaten aufbereitet sein müssen (Joins, Filter, Anreicherungen) oder bereits als „Weitere Datenquelle“ konfiguriert sind.

Kann ich Entity und Datenquelle gleichzeitig setzen?

Nein. Pro Aggregationsregel ist entweder eine Entity oder eine Datenquelle als Quelle gesetzt, nie beides. In der Oberfläche wird das jeweils andere Feld deaktiviert, sobald eine Auswahl getroffen wird.

7

V1.1: Datenquellen-Aggregation (In-Memory)

Seit Version 1.1 können berechnete Felder auch über beliebige Datenquellen aggregieren (In-Memory). Das ermöglicht Berechnungen über komplexe Join-Konstellationen hinweg — inklusive Filterbedingungen.

Beispiel: Summe aller Auftragspositionen eines Kunden aus einer verknüpften Datenquelle — gefiltert auf Status = Abgeschlossen. Die Berechnung erfolgt In-Memory beim Laden der Datenquelle.

TemporalValue-Aggregationstyp

Der neue Aggregationstyp TemporalValue ermittelt den zum Stichtag gültigen Wert aus einer Versionshistorie. Ideal für versionierte Daten wie Preisänderungen, Tarifumstellungen oder andere zeitlich begrenzte Werte.