Select abfrage aus Variable möglich ?
Kann ich eine Select Abfrage aus Variable zusammensetzen ?
Bsp.1:
let Table := "Aufträge";
let Field := "Status";
let Wert := 3
select Table where Field = Wert
oder vielleicht sogar
let a := "'Aufträge' where 'Status' = 3";
select a
15 Antworten
-
Das wär schön. - Ist aber derzeit nicht möglich.
Birger
-
... sowas hab ich mir auch schon gewünscht... :-/
-
...ich mir auch :-)
-
Hallo zusammen,
gibt es hier schon Neuigkeiten? Wertabhängige Selectstatements würden mir an vielen Stellen die Arbeit erleichtern (und dem Ganzen schon fast die Flexibiität von Perl geben)
-
es gibt die eval() Funktion, mit der man dynamisch Code erzeugen kann. Verwende ich mittlerweile häufig.
Seht mal hier:
https://ninox.com/de/forum/technische-hilfe-5ab8fe445fe2b42b7dd39ee8/text-berechnen-6028455d9ed0fa2fdd8f39a2?post=602863ea43810f36bc94f423&page=1 -
Prinzipiell sind, wie schon geschrieben, auch solche Konstrukte möglich:
*
eval(---
select { TABELLE }[ { BEDINGUNG } { OPERATOR } { WERT } ].{ FELD }
---, this)
*
Für alle Einträge in Großbuchstaben können Textwerte hinterlegt werden. Was mir noch fehlt und was ich noch nicht zum Laufen gebracht habe, ist eine select-Abfrage für eine Ansicht. Da würde ich sie gern nutzen. Aber das Ergebnis ist leider kein Array aus Records, sondern irgendwelche raw-Werte ["K899","K900","K901","K902"]. Oder hat hier schon mal jemand mit Erfolg eine Ansicht per eval() gestaltet? Gruß Mirko
-
Hallo Mirko, für { FELD } könntest du "number(Nr)" einsetzen, das Ergebnis in ein Array schreiben und dieses nochmals in einer for-Schleife mit record() durchlaufen. Das müsste eigentlich auch in einer Ansicht funktionieren.
-
Hallo Mirko bei den Werten handelt es sich um einen zusammengesetzten Wert aus TabellenID (Buchstabenkombi) und RecordID in der Tabelle.
Mit eval() kannst du zwar bei Anwendung auf select ein Array mit Werten, die entweder aus der ID der gefundenen Records oder aus dem vorgegebenen Feldwert bestehen erhalten.
Das Ergebnis wird sich aber nicht in einem Ansichtlfeld darstellen lassen.Ich habe alles was mir einfällt probiert um mit eval() ein Ansichtsfeld varabel zu bestücken.
eval() habe ich nicht zum laufen bekommen, dass entweder eine sinvolle oder überhaupt eine Anzeige erfolgt.
-
Hallo Uwe, Problem ist, dass Ninox die IDs des "select" in einer Ansicht als Strings zurückgibt. Warum auch immer. Deshalb die Idee, als Workaround statt der kompletten IDs nur die Datensatznummern auszulesen und dann mit record() zu verarbeiten. Als einfaches Beispiel:
let myTable := "Tabelle";
let myCondition := "Jahr = 2021";
let myArray := eval(---
(select { myTable }[{ myCondition }]).number(Nr)
---, this);
let myView := for i in myArray do
record(Tabelle,number(i))
end;
myView
Das funktioniert auch in einer Ansicht. Hab's gerade noch mal probiert.
-
Hallo Uwe. Geht mir genau so. Ich habe auch alle möglichen Kombinationen versucht inklusive Biß in die Tastatur und dann aufgegeben. "Expression does not return records" kam als Fehlermeldung bei der Auswahl der Spalten. Egal ob ich Schleifen mit item() oder record() durchgeführt habe, oder das Basisarray der ID noch mit diversen Mehrfachumvormungen in ein Zahlenarray umgewandelt habe. Schlussendlich ließ sich von mir kein Array aus Records erstellen. Schade, aber verschmerzlich.
Hallo Axel. Deine Version funktioniert natürlich, da in der Schleife ja der Originalname der Tabelle angegeben wird und nicht die Variable myTable. Aber dadurch ist die Ansicht nicht mehr von außen durch ein Textfeld steuerbar, was ja schick wäre, sondern wieder festgelegt auf eine Tabelle und damit wäre der ganze Umweg über eval() irgendwie überflüssig. Oder let myZustand:=urlaubsreif. Sinngemäss, aber leider nicht funktionierend, müsste es doch so aussehen:
*
let myTable:=TEXTFELD ODER AUSWAHLFELD
let ary := eval(---
select { myTable }.number(Nr)
---, this);
eval(---
for i in ary do
record ({ myTable },number(i)) end
---, this)
*
Euch schönes WE. Mirko
-
Hallo Mirko, das Beispiel diente nur der technischen Demonstration, wie sich Abfragen mit eval() variabel zusammensetzen lassen. Also die abzufragenden Felder und Werte. Verschiedene Tabellen in einer Ansicht anzeigen zu lassen, ist nach meiner Erfahrung sowieso problematisch. Auch bei einem einfachen switch. Man bekommt immer die Spalten der ersten Tabelle angezeigt. Deshalb habe ich bisher immer für jede Tabelle eine eigene Ansicht erstellt und über "Anzeigen, wenn" ein- bzw. ausgeblendet.
Natürlich wäre es schön, wenn man eine Ansicht quasi als Container (abwechselnd) für verschiedene Tabellen nutzen könnte und eval() dann auch noch die Original-IDs zurückgeben würde. Aber es ist eben nicht so, dass sich eval() generell nicht in Ansichten einsetzen ließe. Wenn man das abzufragende Feld und den gesuchten Wert wählen will, kann die beschriebene Möglichkeit über eval() und record() ja schon sehr nützlich sein.
-
Öhm, bei mir beschwert der sich immer, das "die Funktion this in diesem Kontext nicht definiert ist" oder so. Kann es sein, dass eval in den Globalen Funktionen nicht funktioniert?
-
Hallo Sebastian,
this ist für die aktuelle Tabelle bestimmt. Wenn du eine globale Funktion schreibst, dann ist this sinnlos. Man muss die Tabelle zuerst in der Funktion definieren.
Leo
-
Ich komme mal auf das Thema zurück.
Ich habe eine halb automatische Lösung gefunden, in der man zwar nicht die ausgewählte Tabelle einer Ansicht dynamisch machen kann, jedoch die Bedingungen variabel gestalten kann ohne mehrere Ansichten vorzuhalten.
Ich habe es mit variablen Operanden (<,<=,=,!=,<=,>,>) in der Bedingung getestet, sowie mit einem Dynamischen Mehrfachauswahlfeld als Suchkriterium.
Der Trick ist folgendes letztes Statement im Script: 'select TabellenName where eval(Variable, this)'
Die Variable muss man sich vorab zusammen bauen.
Bsp1. let Variable := "number(Zahlbetrag) " + item(splitx(text(Operand), "\,"), 0) + format(Vergleichsbetrag, "0.0#.#") [Operand und Suchwert werden aus einem (dyn)Auswahlfeld/Zahlenfeld entnommen]Bsp2. let variable := "text(Shop) = " + """" + trim(item(splitx(text(dMAwF_ShopAuswahl), "\,"), 0)) + """" + " or text(Shop) = " + """" + trim(item(splitx(text(dMAwF_ShopAuswahl), "\,"), 1)) + """" [ShopAuswahl ist ein dyn. Mehrfachauswahlfeld]
Im Vorliegenden Fall sind 2 Werte im dynMAwF gewählt wurden.
Über eine Schleife kann man den TextString abhängig von den ausgewählten Werten erzeugen.
Die Ansicht kann damit variabel auf die Bedingung reagieren. -
Ich werde das mal demnachst in die'0001_Ninox-Reference' als Beispiel/Example aufnehmen und auch in die 002 zum testen reinstellen.
Mit Sicherheit ist das für die Ninox-Cracks ein alter Hut und wahrscheinlich nicht sehr elegant programmiert, aber ich kann damit unterschiedlichste Bedingungen in diese EINE Ansicht einpflegen.
Content aside
- vor 2 JahrenZuletzt aktiv
- 15Antworten
- 2071Ansichten