Zum Inhalt

Filter-Container

Der Filter-Container ist eine Filterleiste mit einem Bereich darunter. Alle Widgets, die vollständig in diesem Bereich liegen, übernehmen die Filter der Leiste. So wird ein Kunde, ein Projekt oder ein Zeitraum einmal gewählt, und Tabellen, Diagramme und Kennzahlen darunter zeigen dieselbe Auswahl.

Filter-Container Rechnungen filtern: oben die Leiste mit dem Datensatz-Filter Kunde (leer = Alle), dem Zeitraum Rechnungsdatum Dieser Monat und Zurücksetzen, darunter die Tabelle Rechnungen mit drei Zeilen
Leiste und Bereich: die Tabelle darunter folgt Kunde und Zeitraum.

Typische Einsatzbereiche

Einsatz Filter Widgets im Bereich
Kundenübersicht Kunde, Zeitraum Rechnungstabelle, Umsatz-KPI, Umsatzdiagramm
Projektcontrolling Projekt, Zeitraum Stunden je Mitarbeiter, Kosten je Monat
Abhängige Auswahl Kunde, danach eine Rechnung dieses Kunden Widgets, deren Abfrage die gewählte Rechnung verwendet
Statusfilter Auswahlliste „offen“, „bezahlt“ Tabelle und KPI
Nur offene Vorgänge Ja/Nein Tabelle

Welche Widgets dem Filter folgen

Folgen dem Filter Folgen dem Filter nicht
Tabelle, Diagramm, Heatmap, KPI, Text, Planungstafel Start, Instanzen, Erstellen, KI-Abfrage, Daten, Kanban, Timer, Stoppuhr, Laufende Timer, Zeiteinträge

Die Widgets der linken Spalte laden neu, sobald sich ein Filterwert ändert. Sie verwenden die Filter über Platzhalter in ihrer SQL-Abfrage, zum Beispiel $(kunde.id). Wie die Platzhalter geschrieben werden, steht unter SQL in Widgets.

Das Widget Datensatz kann ebenfalls einem Datensatz-Filter folgen; diese Verbindung lässt sich derzeit aber nicht im Designer einrichten.

Zum Filter-Container gehört nur, was vollständig in seinem Bereich liegt. Ein Widget, das nur teilweise hineinragt, wird im Designer rot umrandet und bekommt keine Filter. Im Eigenschaftenpanel zeigt Zugeordnete Widgets, welche Widgets dazugehören.


Einrichten

Dialog Filter-Container konfigurieren mit Höhe des Container-Bereichs 4 und zwei Filtern: kunde als Datensatz mit Datenschema Kontakt und zeitraum
Je Filter Schlüssel, Beschriftung, Typ und die Einstellungen des Typs.
  1. Widget Filter-Container zum Dashboard hinzufügen. Es ist eine Zeile hoch; darunter liegt sein Bereich.
  2. Im Eigenschaftenpanel Filter konfigurieren wählen. Der Dialog Filter-Container konfigurieren öffnet sich.
  3. Höhe des Container-Bereichs (Zeilen) festlegen: So viele Rasterzeilen unterhalb der Filterleiste gehören dazu. Alternativ wird der Bereich im Designer am Rahmen größer oder kleiner gezogen.
  4. Mit Filter hinzufügen die Filter anlegen, jeweils mit Schlüssel, Beschriftung und Typ (siehe unten).
  5. Speichern.
  6. Die gewünschten Widgets vollständig in den Bereich unterhalb der Filterleiste legen und in ihrer SQL-Abfrage die Platzhalter verwenden. Der Dialog zeigt unter Platzhalter für SQL die passenden Platzhalter zum Kopieren und unter Muster für „Alle“ die Bedingung für die Option „Alle“.
  7. Dashboard veröffentlichen.

Schlüssel ist der Name im Platzhalter: nur Buchstaben, Ziffern und Unterstrich, beginnend mit einem Buchstaben, zum Beispiel kunde. Beschriftung ist der Text, den Betrachter in der Leiste sehen. Filter ohne Schlüssel werden beim Speichern verworfen.

Für jeden Filter gibt es zwei Schalter:

  • Pflichtfeld (Widgets laden erst nach Auswahl): Solange nichts gewählt ist, laden die Widgets im Bereich nicht und bleiben ohne Hinweis leer. Text-Widgets laden trotzdem. Ist „Alle“ gewählt, gilt der Filter als ausgefüllt.
  • Option „Alle“ anbieten (filtert dann nicht): Betrachter können „Alle“ wählen; ein leerer Filter gilt dann ebenfalls als „Alle“. Die Abfrage muss dafür nach dem Muster ($(kunde) = '__ALL__' OR spalte = $(kunde.id)) geschrieben sein. Für die Typen „Zeitraum“ und „Ja/Nein“ gibt es diese Option nicht.

Filtertypen

Typ Was Betrachter wählen Einstellungen Platzhalter
Datensatz einen Datensatz eines Datenschemas, mit Suche Datenschema $(kunde) bzw. $(kunde.id), $(kunde.document_name), $(kunde.feldname)
Datensatz per SQL einen Eintrag aus einer Liste, die eine SQL-Abfrage liefert SQL-Abfrage für die Auswahlliste, Vorab geladene Einträge $(kunde) bzw. $(kunde.id), $(kunde.document_name)
Zeitraum einen Zeitraum Verfügbare Zeiträume (Standard alle, „Gesamt“ heißt in der Leiste „Alle“), Vorausgewählter Zeitraum (Standard Dieser Monat), Freier Zeitraum (an), Monatsauswahl, Jahresauswahl $(zeitraum.start), $(zeitraum.end)
Auswahlliste einen festen Wert Optionen, Standardwert $(status)
Ja/Nein an oder aus Standardmäßig aktiviert $(nur_offene) wird TRUE oder FALSE

Die Optionen einer Auswahlliste werden eine pro Zeile im Format wert|Beschriftung eingetragen, zum Beispiel offen|Offen. In der Abfrage kommt der Wert an, also offen.

Datensatz per SQL

Die Abfrage für die Auswahlliste muss genau diese vier Spalten liefern:

Spalte Bedeutung
id Wert, den die Widget-SQL über $(schlüssel) erhält
data_schema_id das Datenschema des Eintrags (der Dialog nennt es „für den Link“; in der Leiste gibt es derzeit keinen Link zum Öffnen)
document_name wird in der Auswahlliste angezeigt
search_string wonach beim Tippen gesucht wird – am besten klein geschrieben, gern mehrere Felder verkettet
SELECT id,
       data_schema_id,
       document_name,
       lower(document_name) AS search_string
FROM app_contacts
  • Die Abfrage wird für die Suche erweitert. Ein Semikolon am Ende gehört deshalb nicht hinein, und auf ein ORDER BY ist kein Verlass.
  • Vorab geladene Einträge (Standard 1000) werden sofort geladen; darüber hinaus wird beim Tippen in der Datenbank weitergesucht, bis zu 50 Treffer je Eingabe.
  • Eine Abfrage darf Filter verwenden, die weiter oben stehen. So entsteht eine abhängige Auswahl, zum Beispiel nur die Rechnungen des gewählten Kunden:
SELECT id,
       data_schema_id,
       app_invoice_no AS document_name,
       lower(app_invoice_no) AS search_string
FROM app_invoices
WHERE ($(kunde) = '__ALL__' OR app_recipient = $(kunde.id))

Ändert sich der Kunde, wird die gewählte Rechnung zurückgesetzt. Verweist eine Abfrage auf einen Filter, der weiter unten steht, meldet der Dialog „Verweist auf später definierte Filter … Filter wirken nur von oben nach unten.“

Zeitraum

Der erste Zeitraum-Filter eines Filter-Containers gilt für alle Widgets im Bereich: Er bestimmt dort auch @periodStart und @periodEnd und ersetzt den eigenen Zeitfilter von Tabelle, Diagramm, Heatmap und Planungstafel. KPI und Text-Widget bekommen nur auf diesem Weg einen wählbaren Zeitraum.

Bei einem Datumsfeld wird der Zeitraum so verwendet: app_invoice_date >= date($(zeitraum.start)) AND app_invoice_date < date($(zeitraum.end)). Bei einem Feld mit Datum und Uhrzeit ohne date(...).


Anwendungsbeispiel: Kunde und Zeitraum für eine Rechnungstabelle

Ziel: Über einer Rechnungstabelle werden ein Kunde (oder „Alle“) und ein Zeitraum gewählt. Das Beispiel nutzt die Tabellen app_invoices (Rechnungen) und app_contacts (Kontakte) aus dem Marketplace.

Filter-Container einrichten:

  1. Widget Filter-Container hinzufügen, Filter konfigurieren wählen.
  2. Höhe des Container-Bereichs (Zeilen): 5.
  3. Erster Filter: Schlüssel kunde, Beschriftung „Kunde“, Typ „Datensatz“, Datenschema das Datenschema der Kontakte, Option „Alle“ anbieten an.
  4. Zweiter Filter: Schlüssel zeitraum, Beschriftung „Rechnungsdatum“, Typ „Zeitraum“, Verfügbare Zeiträume „Dieser Monat“, „Dieses Quartal“, „Dieses Jahr“, „Gesamt“; Vorausgewählter Zeitraum „Dieses Jahr“; Freier Zeitraum, Monatsauswahl und Jahresauswahl an.
  5. Speichern.

Tabelle in den Bereich legen:

  1. Widget Tabelle vollständig in den Bereich unterhalb der Filterleiste legen.
  2. Tabelle konfigurieren wählen und die Abfrage unten eintragen.
  3. Testen: Der Testlauf setzt für den Kunden „Alle“ ein, damit die Spalten auch ohne Auswahl ermittelt werden.
  4. Speichern und das Dashboard veröffentlichen.
SELECT app_invoice_no AS rechnungsnr,
       app_invoice_date AS rechnungsdatum,
       app_gross_total AS brutto
FROM app_invoices
WHERE ($(kunde) = '__ALL__' OR app_recipient = $(kunde.id))
  AND app_invoice_date >= date($(zeitraum.start))
  AND app_invoice_date < date($(zeitraum.end))
ORDER BY app_invoice_date DESC

Was die Abfrage tut:

  • $(kunde) = '__ALL__' ist wahr, wenn „Alle“ gewählt oder nichts ausgewählt ist – dann gilt die Kundenbedingung nicht.
  • app_recipient = $(kunde.id) vergleicht das Referenzfeld der Rechnung mit der Id des gewählten Kontakts.
  • date($(zeitraum.start)) macht aus dem Zeitraum ein Datum, weil app_invoice_date ein Datumsfeld ist.

Eine KPI „Gesamtumsatz“ im selben Bereich folgt automatisch dem gewählten Zeitraum, wenn ihre Abfrage @periodStart und @periodEnd verwendet.


Hinweise

  • Die Auswahl der Betrachter wird im Browser gespeichert und beim nächsten Öffnen wiederhergestellt. Zurücksetzen in der Leiste stellt die Standardwerte her. Datensatz-Filter mit Option „Alle“ zeigen den Zusatz „(leer = Alle)“.
  • Auf dem Smartphone steht die Leiste einspaltig, die zugehörigen Widgets folgen direkt darunter mit farbiger Kante.
  • Ein leerer Filter ohne Option „Alle“ wird zu NULL. Eine Bedingung wie spalte = $(kunde.id) findet dann nichts, das Widget bleibt leer.
  • Ein $(…)-Platzhalter in einem Widget außerhalb des Bereichs wird nicht ersetzt – die Abfrage schlägt fehl.
  • Widgets, die nicht dem Filter folgen (siehe oben), dürfen trotzdem im Bereich liegen; sie arbeiten wie gewohnt.