0

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

null
    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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.

    • Skydive_Leipzig_Manife
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Dann versuche ich es mal mit Bildern zu verdeutlichen:

    Bild 1 zeigt den Ausschnitt einer Tabelle. Man beachte die Spalte "Nr"

    Bildschirmfoto 2019-05-23 um 20.19.11

    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.

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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.

    • Skydive_Leipzig_Manife
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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.

    • Skydive_Leipzig_Manife
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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.

    • Skydive_Leipzig_Manife
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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 ;-)

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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.

    • Felix
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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.

    • Felix
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Test

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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))