0

"Variable" SQL-Abfragen

Hallo Forum,

wahrscheinlich mal wieder eine Neulings-Frage aber ich probier's mal:

Auf einem Dashboard möchte ich abhängig von Auswahlfeldern eine SQl-Abfrage generieren. Am liebsten würde ich mir die natürlich vorher als String zusammenbasteln und Abfragebedingungen nur hinzufügen, wenn ich dem entsprechenden Auswahfeld auch eine Auswahl getroffen wurde.

Nun habe ich schon folgendes probiert:

1. die Abfrage in verschachtelten if-statements entsprechend der Auswahlfeldauswahl jeweils angepasst. (sehr mühsam!). Das funktioniert aber bei der Weiterverarbeitung nicht, weil offensichtlich das Abfrageergebenis nicht in einer Unterstruktur definiert werden darf (gleicher Fehler wie unten im Screenshot)

2. habe ich versucht die Abfrage wie oben erklärt als String zusammenzubauen und mit:

let ergebnis := eval(abfrage, this);

 

 

zu generieren. Das führt zum gleichen Feher wie bei 1.

3. habe ich versucht die Tabelle und die Abfragebedingungen jeweils als string zu definieren und mit:

let ergebnis := eval(---
(select { tabelle }[{ abfragebedingungen }])
---, this);

 

 

abzufragen.

Ob Varinte 2 oder 3 funktionieren (würden) kann ich leider gar nicht sagen, weil der Code so nicht zu speichern ist. (siehe Fehler im Screenshot.)

 wenn ich jetzt die Abfrage aus Zeile 6 stehen lasse und die aus Zeie 8-10 lösche funktioniert's wieder problemlos.

2 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Hallo Frank, nur der Vollständigkeit halber: Der Befehl für den Zugriff auf eine Tabelle heißt bei Ninox zwar auch „select“, hat mit SQL aber nichts zu tun. Und eval() ist eine inoffizielle, undokumentierte Funktion, die m. W. ursprünglich wohl nur dazu gedacht war, einfache Rechenoperationen durchzuführen. Natürlich haben findige Nutzer schnell gemerkt, dass mit eval() mehr möglich ist, aber längst nicht alles. Grundsätzlich funktioniert eval() sowieso nur in der Cloud und es sind auch nur lesende Operationen möglich.

    Der Nutzen ist m. E. in diesem Fall ohnehin zweifelhaft, da die Abfrage mit mehreren, durch die Schlüsselworte „and“ bzw. „or“ verbundene Bedingungen ja auch erst zusammengebaut werden müsste. Um komplexe if-Verschachtelungen zu vermeiden, bevorzuge ich in solchen Fällen deshalb die Vorgehensweise mit einem Hilfsfeld und einer switch-Abfrage.

    Angenommen, eine Ansicht der ‚TabelleXY‘ soll über zwei Auswahlfelder namens ‚Status‘ und ‚Kategorie‘ filterbar sein. Dann würde ich nach folgendem Schema vorgehen:

    let me := this;
    let myA := "";
    myA := myA + if Status then "X" else "_" end;
    myA := myA + if Kategoorie then "X" else "_" end;
    switch myA do
       case "X_": select TabelleXY where Status = me.Status
       case "_X": select TabelleXY where Kategorie = me.Kategorie
       case "XX": select TabelleXY where Status = me.Status and Kategorie = me.Kategorie
       default: select TabelleXY
    end

    Das funktioniert auch mit drei oder mehr Filtern, wobei die Zahl der Kombinationen natürlich exponentiell steigt. Ich selbst hatte allerdings noch nie mehr als vier mögliche Filter, deshalb hat das für mich bisher immer gut funktioniert.

    • Frank_Heitmann.1
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Danke für die Antwort. Das werde bei nächster Gelegenheit mal ausprobieren.

Content aside

  • vor 7 MonatenZuletzt aktiv
  • 2Antworten
  • 85Ansichten
  • 2 Folge bereits