Merkwürdige Problem seit einigen Tagen!

Mein Kunde hat Seite einigen Tagen merkwürdige Probleme. Alles Dinge die seit Monaten ohne Probleme funktioniert habe. So wie es aussieht liefern lesende Abfragen (Wert aus Datensatz lesen, select, etc.) machmal "null" und manchmal den korrekten Wert!
Ich konnte das Problem auf folgendes minimale Skript eingrenzen. Das Skript führe ich in der Console in der Browser-Umgebung aus (nicht in einem native Client!):
let me := (create Test);
me.(Zahl := 83412);
let zahl := me.Zahl;
if zahl = null then
"Not found";
else
"Found: " + zahl;
end
Um das Skript zu verwenden muss man vorher eine neue Tabelle "Test" mit nur einer Spalte "Zahl" anlegen.
Wenn man nun schnell hintereinander auf "Ausführen" klickt, kommt ab und zu "Not found"!
IMHO ist das ein Fehler - außer ich stehe hier auf'm dem Schlauch und sehe meinen Fehler nicht.
@Ninox Schraubt ihr gerade im Hintergrund am System herum???
Grüße Andreas
10 Antworten
-
Hi Andreas,
in deinem Skript kann ich keinen Fehler erkennen. Sollte also eigentlich den korrekten Datensatz ausgeben.
Ich habe persönlich in der App-Version seit Version 3.16.4 vielfältige Fehler in bestehenden Tabellen, wo bisher alles sauber war. Das passt gefühlt grundsätzlich zu deinem Fehlerbild. Die Fehler traten erstmals im Juni 2025 auf.
Ich konnte den oder die Fehler aber nicht identifizieren. Wenn ich zum Beispiel die Position einiger Formeln, die nicht korrekt berechnet werden, im Formular nach oben schiebe, dann werden sie richtig ausgegeben. Eine Berechnung sollte nicht von der Position des Feldes abhängen.
Einige select Formeln werden überhaupt nicht ausgewertet. Wenn ich eine neue Tabelle mit den identischen Feldern manuell aufsetze, funktioniert es aber auf einmal. Nach einem Neustart der App tritt der Fehler dann aber auch in der neuen Tabelle auf.
Oft hängt sich die App in einigen Tabellen durch verschiedene Aktionen einfach auf. Wenn ich dann zum Beispiel ein Auswahlfeld anklicke, reagiert die App nicht mehr und ich muss sie wieder neustarten. Ninox scheint einige Dinge im Hintergrund geändert zu haben, die eben zu diversen Fehlern führen. Durch die nachfolgenden Updates 3.16.5 und 3.16.6 wurde keins der Probleme adressiert.
Ich habe an dem Punkt ehrlich gesagt aufgegeben, weil die Fehler so zahlreich sind, dass ich Ninox nicht mehr zuverlässig nutzen kann. Echt schade, weil es eigentlich eine schöne Software war!
Grüße
Alex
-
Das Problem wurde soeben vom Ninox Support als Blocker-Bug bestätigt!
-
Danke, dass Sie den Informationen geteilt hast. Das Support-Team von Ninox hat das Problem aufgegriffen und als Blocker eingestuft. Wir arbeiten daran, das zu lösen.
-
Der Fehler betrifft hauptsächlich diese Art Scriptkonstellation, wo ein Wert aus einem neu erstellten Record direkt einer Variablen zugeordnet werden soll und mit dieser Variablen weiter gearbeitet wird.
Er betrifft auch nur Scripts mit dieser Fallkonstellation, die über einen Button im Browser ausgeführt werden.
Er tritt nicht auf in den nativen Apps, Trigger Skripte oder bei Einbettung in 'do as transaction'.
Als Workaround bietet sich somit bei den entsprechenden Buttonscripten die Einbettung des Script in 'do as transaction' an.
Das ist leider momentan mit einem Mehraufwand beim bearbeiten bestehender Scripte verbunden.
Uwe
-
Ninox-Skript und andere Programmiersprachen: In Ninox wird jeder Schritt im Skript ausgeführt, ohne explizit darauf zu warten, dass der vorherige Schritt abgeschlossen ist, wodurch das Skript einfacher zu schreiben ist. Ein Skriptschritt läuft in Millisekunden ab, vorausgesetzt der Kontext ist schnell genug, um den nächsten Schritt mit den benötigten Eingaben zu versorgen. Dies ist konzeptionell ähnlich wie synchrones JavaScript und ist ein gängiger Ansatz in der synchronen Programmierung. Der Nachteil dieser Flexibilität ist, dass der vorherige Schritt zurückgelassen werden kann, wenn die zurückgegebenen Daten länger brauchen, um aus einem anderen Kontext zurückzukehren, sodass das Skript zum nächsten Schritt fortschreitet, aber nicht die benötigten Eingaben hat. Das Ergebnis ist in diesem Beispiel, dass "not found" auftritt.
Tatsächliches Ninox-Skriptverhalten: In Ninox aktualisiert ein Skriptschritt einen Datenpunkt in einem Datensatz, sendet den Befehl an einen anderen Kontext, den Server, und fährt mit dem nächsten Schritt im Skript fort. Daten werden vom Server zurück zum Client synchronisiert, das bedeutet, Daten werden in einen anderen Kontext zurücksynchronisiert. Ähnlich wie bei JavaScript kann es also vorkommen, dass ein Skript, das den Serverkontext aufruft, die Daten zurückgibt, nachdem das Skript bereits weitergegangen ist, was zu einem "not found" oder leeren Ergebnis führt.
Die Lösung:
do as transaction
garantiert, dass jeder Schritt abgeschlossen ist, bevor weitergemacht wird. Dies ist ähnlich wiecallbacks
in JavaScript. In "do as transaction" müssen alle Änderungen auf dem Server abgeschlossen sein, bevor das Skript fortfahren darf. Dies kann das Skript blockieren, aber es garantiert ein zurückgegebenes Ergebnis basierend auf einem Schritt, der einen anderen (Server-)Kontext im Skript verwendet und abgeschlossen ist, bevor fortgefahren wird.Unsere Triage-Arbeit deutet darauf hin, dass dieses Verhalten schon lange im Produkt vorhanden ist. Wir müssten eine neue Funktion für Ninox-Skript entwickeln, um dieses Problem zu behandeln, und zu diesem Zeitpunkt planen wir nicht, dies zu tun.
-
In Ninox wird jeder Schritt im Skript ausgeführt, ohne explizit darauf zu warten, dass der vorherige Schritt abgeschlossen ist, wodurch das Skript einfacher zu schreiben ist ...
Danke für die Klarstellung. Also ich muß gestehen (und ich entwickle seit 35 Jahren Software), dass mir das nicht klar war! Ich habe mir durch die Probleme der letzten Tage schon gedacht, dass hier Dinge ggf. asynchron ablaufen. Die Begründung, dass Skripte dadurch "einfacher zu schreiben" sind lasse ich mal so im Raum stehen. Ich vertrete hier eine andere Meinung. Ich sehe das gerade als nicht "synchron". Wenn es "synchron" wäre, könnte jeder Schritt im Skript sich auf sie Daten der vorherigen Zeile verlassen! Von einer "Low-Code" Plattform wie Ninox erwarte ich mir eine Skriptsprache die den Nutzer nicht mit Nebenläufigkeiten das Leben erschwert ...
... vorausgesetzt der Kontext ist schnell genug
Das ist ja der perfekte "Zufallsgenerator". Ich habe ja nicht wirklich Einfluß darauf "wie schnell der Kontext" ist! (außer ich nutze "do as transaction")
Ich kann euch nur empfehlen diesen letzten Foreneintrag von Markus in eure Dokumentation ganz oben unter "Einführung in Ninox-Skript" zu packen. Dann weiß man wenigsten von Anfang an worauf man achten muß.
Was das allerdings nicht beantwortet:
Warum habe wir die massiven Probleme erst seit ca. 2 Wochen?
Aber nach der obigen Beschreibung genügt ja die kleinste Änderung im Timing zwischen Client und Server um in das Problem zu laufen ...
Grüße
Andreas
Content aside
- vor 13 TagenZuletzt aktiv
- 10Antworten
- 120Ansichten
-
6
Folge bereits