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.
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
- Widget Filter-Container zum Dashboard hinzufügen. Es ist eine Zeile hoch; darunter liegt sein Bereich.
- Im Eigenschaftenpanel Filter konfigurieren wählen. Der Dialog Filter-Container konfigurieren öffnet sich.
- 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.
- Mit Filter hinzufügen die Filter anlegen, jeweils mit Schlüssel, Beschriftung und Typ (siehe unten).
- Speichern.
- 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“.
- 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 BYist 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:
- Widget Filter-Container hinzufügen, Filter konfigurieren wählen.
- Höhe des Container-Bereichs (Zeilen):
5. - Erster Filter: Schlüssel
kunde, Beschriftung „Kunde“, Typ „Datensatz“, Datenschema das Datenschema der Kontakte, Option „Alle“ anbieten an. - 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. - Speichern.
Tabelle in den Bereich legen:
- Widget Tabelle vollständig in den Bereich unterhalb der Filterleiste legen.
- Tabelle konfigurieren wählen und die Abfrage unten eintragen.
- Testen: Der Testlauf setzt für den Kunden „Alle“ ein, damit die Spalten auch ohne Auswahl ermittelt werden.
- 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, weilapp_invoice_dateein 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 wiespalte = $(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.