0

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

null
    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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.

    • dstone
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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.

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
     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.

    • dstone
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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