Skip to end of metadata
Go to start of metadata

Der SpreadsheetFilter gehört mit zu den wichtigsten und am häufigsten benötigten Steps. Mit diesem Step kann man Zeilen aus einem Spreadsheet herausfiltern / entfernen. Dazu definiert man eine Filterbedingung, die beschreibt, welche Zeilen noch im Spreadsheet verbleiben dürfen. 

Konfiguration

Der Step kann mit beliebigen anderen Steps verwendet werden, die als Output ebenfalls ein Spreadsheet haben. Meistens findet man diesen Step nach einem SpreadsheetMapper.


Durch Eingabe einer Filterbedingung in Freemarker-Syntax kann man die Zeilen bestimmen, die im Ergebnis-Spreadsheet auftauchen sollen. 

Im Beispiel würden alle Zeilen im Ergebnis-Spreadsheet auftauchen, deren Spalte "condition" den Wert "new" enthält. 


Statt der manuellen Eingabe, kann auch ein komfortabler Wizzard für die initiale Erstellung des Filterausdrucks genutzt werden. 

Dadurch wird z.B. folgender Filterausdruck erzeugt:

Negatives Ergebnis

Wenn man das genaue Gegenteil braucht (im Beispiele "alle Zeilen, wo condition NICHT "new"  bzw. der price <= 50 ist) gibt es einen zweiten Step-Output negativeOutput.
Dieser beinhaltet genau dieses negierte Ergebnis-Spreadsheet. 

Vorteil: Man spart sich einen weiteren SpreadsheetFilter-Step und der Flow wird übersichtlicher. 


Zeilen-Validierung

Es gibt Spreadsheets, die mit Schema-Definitionen (siehe Datastores#Schema) verknüpft sind. Dazu zählen der SearchDatastore oder SpreadsheetMapper Step. 
Über das Schema kann man für jede Spalte Regeln festlegen (z.B. Datentyp, erlaubte Werte, reguläre Ausdrücke, Beschreibung). Diese Schemainformationen kann man auswerten und entscheiden ob ein einzelnes Feld oder eine ganze Zeile eines Spreadsheets valide ist oder nicht. 

Dazu gibt es im SpreadsheetFilter jetzt auch Filtermöglichkeiten. 


Invalide Zeilen filtern

Um einen Filter auf die ganze Zeile anzuwenden, wählt man in der Filter-Auswahl Zeile und dann bei Zeilen-Operatoren 

  • ist valide
  • ist nicht valide

Dadurch wird folgendes Filter-Skript erstellt: 

${row.isValid()}

Dieser Filter lässt nur Zeilen durch, deren Spalten alle Validierungsregeln des Schemas erfüllen (z.B. alle Pflichtspalten gefüllt, erlaubte Werte passen usw.)

Alle ungültigen Spalten (d.h. die mindestens einen Fehler enthalten erhält man mit dem negierten Filter):

${!row.isValid()}



Spalten validieren

Das gleiche Prinzip funktioniert auch mit einzelnen Spalten.

Um zum Beispiel nur Zeilen zu erlauben deren Preis-Spalte valide ist, kann man folgenden Filter erstellen:

${price.isValid()}

Hinweis

Die Validierung funktioniert nur, wenn dem Spreadsheet auch ein Schema zugrunde liegt. Das ist nur bei Spreadsheets aus dem SearchDatastore oder SpreadsheetMapper mit Ziel-Schema der Fall.


Erweiterte Optionen

SpreadsheetFilter kurzzeitig deaktivieren

Bei der Erstellung der späteren Bearbeitung oder bei der Fehlersuche kommt es häufig vor, dass man einen SpreadsheetFilter im Flow gern mal deaktiviert, um zu prüfen, was der Filter so alles wegschneidet, und ob das auch korrekt ist. 

Mit der Bypass-Option im SpreadsheetFilter kann man die Filterung deaktivieren. D.h. der Step bleibt ganz normal aktiviert, aber die Filterbedingung wird ignoriert. Der Step lässt praktisch den Input ungefiltert durch (Input = Output). 
Im Evenltog taucht dann eine Warnung auf, falls man mal vergisst den Filter wieder zu aktivieren. Zum deaktivieren des Filters stellen Sie bypass=Yes. Standardwert ist No. 


CacheMode aktivieren

Die Option cacheMode kann genutzt werden, um das Ergebnis des SpreadsheetFilter zwischen zu speichern. Dabei kann man Auswählen ob man nur das positive- oder negative Ergebnis cachen möchte, oder das gesamte Ergebnis.

Hinweis: Bei aktiviertem CacheMode gibt es eine Einschränkung. Der Zugriff von Varianten-Zeilen auf Parent-Zeilen funktioniert, aber der Zugriff von Child-Zeilen auf Master-Zeilen funktioniert nicht. 
D.h. man kann ${parent['columnname']} benutzen, jedoch nicht ${master['columnname']}. (Siehe auch Auf Relationen zugreifen). Aus diesem Grund ist der CacheMode standardmäßig deaktiviert.



Beispiel 1 - Nach einer Spalte filtern

Gegeben sei folgendes Input-Spreadsheet:

idnamekategoriepreis
1Artikel1Schuhe29.99
2Artikel2Hosen19.99
3Artikel3Hosen39.99


Anforderung: 
Ich will alle Artikel aus der Kategorie "Hosen".

Filterbedingung: kategorie! == "Hosen"

Ergebnis: Das Spreadsheet nach der Filterung enthält nur Artikel2 und Artikel3

idnamekategoriepreis
2Artikel2Hosen19.99
3Artikel3Hosen39.99


Beispiel 2 - Nach 2 Spalten filtern

Erweitern wir das erste Beispiel und filtern jetzt zusätzlich noch nach der Preisspalte, so dass wir nur Hosen bekommen, die > 20 EUR kosten. 

Gegeben sei folgendes Input-Spreadsheet:

idnamekategoriepreis
1Artikel1Schuhe29.99
2Artikel2Hosen19.99
3Artikel3Hosen39.99

Anforderung: Ich will alle Artikel aus der Kategorie "Hosen" die teurer sind als 20 EUR. 

Filterbedingung: (kategorie! == "Hosen" && preis?number > 20.00)

Ergebnis: Das Spreadsheet nach der Filterung enthält nur Artikel3, weil das die einzige Hose ist, welche die Bedingung erfüllt. 

idnamekategoriepreis
3Artikel3Hosen39.99

Spaltenauswahl statt fester Wert in der Bedingung

Statt feste Zeichenketten in der Bedingung zu verwenden, wie im obigen Beispiel, kann man optional auch auf die Werte von Spalten in der Bedingung zugreifen. Das ist sehr praktisch, wenn man hochdynamische Bedingungen bauen will, die nicht nur auf feste Werte vergleichen, sondern dynamisch mit den Werten aus Spalten im Spreadsheet arbeiten. 

Das resultiert in folgender Bedingung. 

Man beachte, dass brandname hier nicht in Anführungsstriche eingeschlossen ist. Das bedeutet, dass es kein fester Wert ist (also keine Zeichenkette) sondern eine Variable. In diesem Fall referenziert diese Variable den Wert der Spalte brandname aus dem Input-Spreadsheet. Übersetzt bedeutet obige Bedingung:

Im Input-Spreadsheet gibt es zwei Spalten marke sowie brandname. Der Filter lässt nur Zeilen durch, wenn beide Spalten den gleichen Wert beinhalten.


Dynamischer Spaltenerkennung durch Step-Ergebnisvorschau

Damit der SpreadsheetFilter die verfügbaren Spalten für die Filterbedingung anzeigen kann, müssen diese bekannt sein. Das funktionierte in der Vergangenheit nur, wenn das zu filternde Spreadsheet aus einem SpreadsheetMapper-Step kam. 
War das nicht der Fall, dann konnte man die Spalten nicht in der Spaltenauswahl sehen. 
Problem: Man musste noch einen Mapper einbauen, damit man sich im Filter komfortabel eine Bedingung zusammen klicken konnte.  

Mittlerweile geht das auch ohne vorgeschalteten SpreadsheetMapper.

Dazu muss man sich die Ergebnisvorschau des SpreadsheetFilters selbst oder des Steps anzeigen lassen, der das Input-Spreadsheet liefert. Sobald die Vorschau einmal angezeigt wurde ist die Spaltenauswahl im SpreadsheetFilter auch verfügbar.


  • No labels