Dashboard Suche mit mehreren Feldern: "select" dynamisch zusammensetzen
Hallo zusammen,
ich bin noch recht neu bei Ninox und bastel mir gerade auf der Mac/iPhone App eine Produktdatenbank, in der ich für mich Preise sammeln will.
Nun habe ich mir ein Dashboard gebastelt und möchte hier über aktuell zwei Eingabefelder eine Suche aufbauen. Da es eventuell späte mehr eingaben werden sollen, möchte ich möglichst übersichtlich das Script gestalten.
Kann ich mir die Select-Anweisung nicht als String zusammenbauen und dann mit einem Befehlt ausführen?
Also aktuell habe ich ein paar verschachtelte IFs, die aber schnell unübersichtlich werden.
if codeSearch != null and keywordSearch != null then
select Produkt where 'EAN Code' = codeSearch or Name like keywordSearch
else
if codeSearch = null and keywordSearch != null then
select Produkt where Name like keywordSearch
else
if codeSearch != null and keywordSearch = null then
select Produkt where 'EAN Code' = codeSearch
else
select Produkt
end
end
end
Einfach alles mit "or" aneinander reihen geht ja auch nicht. Bei …
select Produkt where 'EAN Code' = codeSearch or Name like keywordSearch
… würde bei einem leeren codeSearch auch Datensätze angezeigt, die keinen EAN Code haben. Das wäre aber nicht mein gewolltes Ergebnis.
4 Antworten
-
Hallo, es gibt eine undokumentierte Funktion namens eval(), mit der sich Strings als Code ausführen lassen. Die funktioniert m. W. aber nur bei Cloud-Zugriff.
Um die Filterung nach verschiedenen optionalen Parametern ohne komplexe if-Verschachtelungen durchzuführen, kann man die betreffende Tabelle bspw. als Array einlesen und dieses dann mit geschlossenen if-Abfragen schrittweise filtern. Angenommen, im Dashboard gäbe es zwei Textfelder (SUCHSTRING1 und -2), in die sich Filterbegriffe eingeben lassen. Dann könnte der Code für eine Ansicht bspw. so aussehen:
let me := this; let myArray := (select TABELLE); if SUCHSTRING1 then myArray := myArray[SUCHFELD1 = me.SUCHSTRING1] end; if SUCHSTRING2 then myArray := myArray[SUCHFELD2 = me.SUCHSTRING2] end; myArray
Vorteil: Die Filterung ließe sich sehr einfach nach demselben Schema mit entsprechenden if-Blöcken um weitere Suchfelder erweitern.
Nachteil: Wenn SUCHSTRING1 und SUCHSTRING2 angegeben wurden, wirkt der zweite nur noch auf den durch Filter1 bereits reduzierten Datenbestand.Eine andere Möglichkeit wäre das Zusammenbauen einer Stringkombination und deren Auswertung über "switch ... case". Dann müsste man zwar auch für jede Kombi einen eigenen select-Befehl angeben, würde aber immerhin verschachtelten if-Abfragen vermeiden.
-
Ok. Danke für die schnelle Rückmeldung und auch das gute Beispiel.
Das mit den eckigen Klammern hatte ich jetzt nicht im Fokus. – Wird doch aus Performance Gründen doch auch weniger empfohlen. Aber ich teste es mal aus.
An manchen Stellen wünschte ich auf SQL zurück greifen zu können. Muss mich hier noch bisschen umstellen.
-
said:
[...] Wird doch aus Performance Gründen doch auch weniger empfohlen.Das kann man so pauschal nicht sagen. Und wenn die betreffende Tabelle nicht hunderttausende Datensätze enthält, kann ich mir kaum vorstellen, dass es da zu spürbaren Verzögerungen kommt. Allerdings habe ich sowas noch nicht lokal mit einer App ausprobiert.
-
Cool. Das funktioniert ganz gut. – Ich experimentiere etwas, daher hab ich noch ein ehr wirres Ziel vor Augen
Meine Lösung
let codeSearch := 'Suche: „EAN Code“'; let keywordSearch := 'Suche: Keyword im Produktnamen'; let properiesSearch := 'Suche: Produkteigenschaften'; let myTable := (select Produkt); if properiesSearch then myTable := (select Produkt where chosen(__Produkteigenschaften, numbers(properiesSearch))) end; if keywordSearch then myTable := myTable[Name like keywordSearch] end; if codeSearch then myTable := myTable['EAN Code' = codeSearch] end; myTable
Die Produkteigenschaften, hab ich als Dynamisches Mehrfachauswahlfeld erstellt. Da ich hier noch nicht sicher bin, ob das die richtige Wahl ist, habe ich die "__" vorweg gesetzt. Also nicht wundern – Bisher bin ich mit dem dynamischen Mehrfachauswahlfeld aber zufrieden. Auch wenn ich hier die Eigenschaften noch gerne Gruppiert hätte. Egal, das ist ein anderes Thema.
Content aside
- vor 1 JahrZuletzt aktiv
- 4Antworten
- 100Ansichten
-
2
Folge bereits