0

today() != today()

In einem kleinem Vokabeltrainer habe ich eine "Hilfstabelle" History, in der ich den Zeitpunkt (dateTime) des letzten Trainings mit einem Datensatzes parallel zum gleichen Datenfeld wie in der "Haupttabelle" speichere. Mithilfe der Einträge in der Tabelle History kann ich bei Bedarf noch einmal zwischen bereits trainierten Datensätzen der Haupttabelle hin- und hernavigieren.  Allerdings reicht mir diese Funktion für den aktuellen Tag. Alle History-Einträge älteren Datums möchte ich bei der ersten Benutzung der Datenbank an einem neuen Tag löschen. Das klappt auch mit dieser Funktion wie erwartet:

delete select History where date(myLastDateTime) < today()

Allerdings funktioniert das nur, wenn die Datenbank am Tag der Nutzung neu gestartet wurde. Sofern ich die Datenbank (Public Cloud, iPhone), abends nicht schließe und am nächsten Tag in der geöffneten Datenbank weiterarbeite, wird der Code nicht ausgeführt - so als würde "today()" weiter das Datum liefern, an dem die Datenbank geöffnet wurde. Allerdings liefert:

alert(today())

auch in einer schon am Vortag geöffneten Datenbank das richtige, das aktuelle Tagesdatum.

Hat jemand eine Erklärung - und eine Idee, wie ich den Code umschreiben könnte?

6 Antworten

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

    Hallo Olaf, die Funktion today() gibt immer das gerade aktuelle Datum zurück. Aber nur, wenn die Funktion auch ausgeführt, also durch einen Button, Trigger oder in einem Formelfeld ausgelöst wird.

    Ich nehme an, dass du den Code zum Löschen der History als „Trigger nach Öffnen“ in den Datenbank-Optionen ausführen lässt. Und dann wird er eben auch nur beim Öffnen der Datenbank ausgeführt, mit den zu diesem Zeitpunkt gültigen Datums-Werten. 

    Als einfachste Lösung könntest du bspw. irgendwo einen Button platzieren, mit dem du das „delete“ bei Bedarf manuell anstoßen kannst, um das Schließen und neuerliche Öffnen der DB zu vermeiden.

      • privat
      • Olaf_Nensel
      • vor 7 Monaten
      • Gemeldet - anzeigen

         Nein, die Funktion habe ich nicht als „Trigger nach Öffnen“ in den Datenbank-Optionen eingebaut. Ich arbeite mit der Datenbank jeden Tag und schließe sie daher nur selten, sondern arbeite meistens am nächsten Tag einfach in der geöffneten Datenbank weiter.  Der Code ist in allen Funktionen aller Button, die den Trainingsstatus verändern.

      Vielleicht noch etwas Interessantes: In der ersten Zeit hatte ich die Datenbank in iCloud. In der Zeit trat das "Phänomen" nicht auf. Erst seitdem ich die Datenbank in die Public Cloud portiert habe, kommt es zu dem Problem, wenn ich die Datenbank weiter auf dem iPhone nutze. Aus diesem Grund wollte ich die Datenbank schon wieder zurück in iCloud verschieben, sehe dafür aber keinen Weg (mein Tarif: Starter).

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

       Ach so, okay, wo kommt denn myLastDateTime her? Und um welchen Datentyp handelt es sich? Versuch doch mal, auch bei today() explizit das Datum herauszuziehen:

      delete select History where date(myLastDateTime) < date(today())
      • privat
      • Olaf_Nensel
      • vor 7 Monaten
      • Gemeldet - anzeigen

       Das Feld myLastDateTime hat den Datentyp timestamp (Date+Time). Die Datenbank besteht nur aus zwei Tabellen:

      Haupttabelle Vocabulary

      In der Haupttabelle Vocabulary wird das Feld myLastDateTime eines Datensatzes bei jeder Änderung des Trainingsstatus durch eine Schaltfläche mit now() neu überschrieben.

      Hilfstabelle History

      Die Hilfstabelle hat nur ein einziges Feld, ebenfalls myLastDateTime. Wenn sich der Trainingsstatus in einem Datensatz der Haupttabelle Vocabulary ändert, wird der Hilfstabelle History ein neuer Datensatz mit dem gleichen Wert im Feld myLastDateTime wie in der Haupttabelle angefügt. Die Hilfstabelle bildet somit der Verlauf des Trainings ab, den ich gelegentlich nutze, aber eben maximal für den jeweiligen Tag.

      date(today())

      Auf diese Idee wäre ich nicht gekommen. Nach der Ninox-Dokumentation soll today() den Rückgabewert date liefern. Testen werde ich es trotzdem einmal.

      • Ninox-Professional
      • planoxpro
      • vor 6 Monaten
      • Gemeldet - anzeigen

       

      Ja, es sollte auch ohne date() funktionieren. Ich habe aber die Erfahrung gemacht, dass es bei Datums- und Zeitwerten manchmal helfen kann, den Datentyp anzugeben. Deshalb ist das immer meine erste, spontane Idee. 😉

      Ansonsten müsste man sich das Datenmodell und die Scripte mal genauer ansehen. Ich sehe da jetzt erst mal nichts Falsches.

      • privat
      • Olaf_Nensel
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Durch die Problematik ist mir aufgefallen, dass ich meine "Hilfstabelle" History eliminieren kann, seitdem ich für die Trainingshistorie nicht mehr die Id, sondern ein DateTime-Feld nutze und sich mit dessen Inhalt (timestamp) schon die Reihenfolge der letzten Trainings darstellen lässt. Nun habe ich nur noch die Haupttabelle Vocabulary. Für Informationen zum Trainingsverlauf nutze ich jetzt dort direkt das Feld LastPractice.

      An dem eingangs beschriebenen Phänomen hat dies alles allerdings nichts geändert. Ich habe jetzt noch eine Formel (Tageszähler) auf meinem Formular mit folgendem Code:

      count(select Vocabulary where date(LastPractice) = today())

      und einen zweiten mit:

      count(select Vocabulary where date(LastPractice) = date(today()))

      date(today()) führt – erwartungsgemäß – zu keinem anderen Ergebnis als today().

      Nachdem ich gestern (24.04.2024) 100 Datensätze trainiert hatte (wobei das Feld LastPractice immer mit dem aktuellen timestamp überschrieben wird), stand der Zähler am Ende entsprechend auf 100. Ohne die Datenbank zwischenzeitlich zu schließen, wurde mir dieser Wert auch heute Morgen (25.04.2024) unverändert angezeigt. Als ich dann zwei weitere Vokabeln trainiert hatte, lief der Zähler weiter auf 101, 102 – so als wäre gestern und heute der gleiche Tag: today(). Verrückt. 🤷‍♂️

      Nachdem ich dann die Datenbank geschlossen und wieder geöffnet hatte, stand der Zähler sofort auf dem richtigen Wert: 2

      Ein großer Vorteil einer nativen App ist für mich – eigentlich –, dass ich mich bei bei jeder Nutzung nicht neu anmelden oder die Anwendung neu starten muss.

      PS:
      - iPhone 15 Max Pro
      - iOS 17.4.1
      - Ninox iOS-App v 3.10.11
      - Ninox Public Cloud, server v 3.11.8

Content aside

  • vor 6 MonatenZuletzt aktiv
  • 6Antworten
  • 89Ansichten
  • 3 Folge bereits