first() und last() funktionieren nicht praktikabel - Eure Alternativen?
Hallo,
hier im Forum wird überall zum Identifizieren der ersten bzw. letzten Datensätze first() bzw. last() empfohlen. Beide Funktionen habe heute in einer meiner Tabellen versagt. Der 1. Eintrag hatte die ID 96, der letzte die ID 101.
First() gab die ID 101 aus, last() die ID 96. Begründung seitens NinoxDB ist die interne alphanumerische Sortierung, in der die 101 VOR der 96 kommt.
Damit sind aus meiner Sicht beide Funktionen völlig unbrauchbar geworden.
Als Alternative wurde mir min() und max() vorgeschlagen, was bei nicht-zahlbaren Inhalten nicht geht und man damit immer den Umweg über die ID gehen muss.
Wie habt ihr das gelöst?
12 Antworten
-
Also, ich kann das Problem nicht nachvollziehen. Bei mir bringt "first(select TABELLE)" immer den ersten, "last(select TABELLE)" den letzten Datensatz der angegebenen Tabelle. Mit min() und max() fragt man einzelne Datenfelder der Tabelle ab. Das kann man sich bspw. zunutze machen, um mit "min((select TABELLE).number(Nr))" ebenfalls den ersten existierenden Datensatz zu ermitteln, genau genommen dessen Nummer (Nr). Mit max() entsprechend den letzten bzw. den mit der höchsten Nummer.
Es wäre deshalb hilfreich, den Kontext zu kennen.
-
Dann versuche ich es mal mit Bildern zu verdeutlichen:
Bild 1 zeigt den Ausschnitt einer Tabelle. Man beachte die Spalte "Nr"
Der Befehl
last(select Einzeltickets).Nr
ergibt dabei 999.
Der Befehl
first(select Einzeltickets).Nr
ergibt 1000
Weil die 1 immer vor der 9 ist..., egal wieviele Stellen die Zahl hat.
-
Wie ich vorhin schon schrieb: first/last gibt den kompletten Datensatz zurück, min/max ein Datenfeld. 'Nr' gilt hier auch als Datenfeld.
Also entweder ohne Angabe eine Datenfeldes:
first(select Einzeltickets)
oder mit (hier Nr):
min((select Einzeltickets).number(Nr))
Je nachdem, ob man die Id eines Datensatzes (first/last) oder den Wert (min/max) eines bestimmten Datenfeldes (in diesem Fall 'Nr') der betreffenden Tabelle ermitteln will.
-
Die Ausgabe ist auch fehlerhaft, wenn man die Abfrage nicht auf die ID beschränkt, sondern den kompletten Datensatz nimmt. Teste es aus, wenn du es mir nicht glaubst. Nur min() und max() funktionieren, wie von dir beschrieben.
-
Erzeuge doch mal 110 Datensätze und mache mal die Abfrage first() und last(). Ich gebe einen Tipp ab: Last() ist nicht der 110. record
-
Ich kann die Aussage von Ralf bestätigen. Das passiert aber nur in der Web-Version. In der App geht alles wie es sein soll
-
Okay, im Browser habe ich es nicht getestet. Hätte aber auch nicht gedacht, dass es bei so grundlegenden Funktionen solche Unterschiede gibt. Da muss man ja echt aufpassen, wenn man für verschiedene Plattformen entwickelt.
Vielleicht sollten wir uns angewöhnen, bei Fragen hier im Forum immer auch die verwendete Version zu nennen.
-
Aus meiner Sicht muss hier dringend an eine rein numerische Sortierung der internen ID´s gearbeitet werden. So ist es jedenfalls Blödsinn. Ach und ja: Web-Version ;-)
-
In der Mac-App funktionieren first() und last() ja, wie sie sollen, nur in der Web-Version eben nicht. Das ist ja das Erstaunliche. Noch erstaunlicher ist, dass der Fehler anscheinend noch nicht bemerkt/gemeldet wurde. Ich habe das gerade nachgeholt.
Davon abgesehen hattest du ja nach Alternativen gefragt. Und der oben genannte Weg über die Datensatznummer mit
min((select Einzeltickets).number(Nr))
funktioniert ja auch im Browser. In Verbindiung mit record() lassen sich auch Funktionen nutzen, welche die ID des Datensatzes als Parameter erwarten, wie zum Beispiel openRecord():
let myRecNo := min((select Einzeltickets).number(Nr));
openRecord(record(Einzeltickets, myRecNo))
Oder auch in einer Zeile:
openRecord(record(Einzeltickets,min((select Einzeltickets).number(Nr))))
Ist natürlich etwas umständlicher, aber es funktioniert immerhin.
-
Leider besteht das Problem noch immer!
Allerdings wie ich herausgefunden habe nur wenn man über select auf eine Tabelle zugreift, dann wird der numerisch kleinste/größte wert Ziffer für Ziffer ermittelt. wenn man direkt auf eine verknüpfte Tabelle verweist first/last(Tabelle) wird korrekt die größte/kleinste Id ermittelt.
-
Test
-
Mit "oder by" kann man eine numerische Sortierung der ID erzwingen. Damit sollten first() und last() auf allen Plattformen funktionieren:
first(select TABELLE order by number(Nr))
Content aside
- vor 4 JahrenZuletzt aktiv
- 12Antworten
- 4904Ansichten