Variablen deklarieren: var und let
Sowohl var als auch let deklarieren eine Variable. Anders als in JavaScript gibt es in Ninox zwischen let und var keinen Unterschied im Gültigkeitsbereich.
Der Typ der Variablen richtet sich nach dem Typ des zugewiesenen Wertes:
var t := "my text";
var b := false;
var n := 10;Eine Variable darf innerhalb desselben Codes mehrfach deklariert werden. Sie behält dann Typ und Wert der bisherigen Zuweisung, bis die neue Deklaration erreicht ist:
var b := true;
dialog("Message 1", "Value of b: " + b, ["ok"]);
var b := 12;
dialog("Message 2", "Value of b: " + b, ["ok"]);Verwechslung zwischen Variablennamen und IDs von Tabellen bzw. Feldern
Ninox speichert seinen Code in einer etwas anderen Form, als er auf dem Bildschirm erscheint: Feld- und Tabellennamen werden durch ihre IDs ersetzt, also durch Buchstaben.
Das folgende Skript etwa, das die Summe der verkauften Positionen berechnet:
sum('Invoice Items'.Total)wird im Systemcode so gespeichert, wobei D die ID der Tabelle 'Invoice Items' und E die ID des Feldes Total ist:
sum(D.E)Legt man in diesem Zusammenhang eine Variable D an, so kann das den Compiler verwirren: Im folgenden Systemcode wäre nicht mehr erkennbar, ob sich D.E auf eine Tabelle oder auf die zuvor deklarierte Variable D bezieht:
(var D := "hello"; sum(D.E))Um solche Verwechslungen zu vermeiden, sollten Variablen Namen tragen, die kaum mit IDs oder mit Namen von Tabellen und Feldern zusammenfallen. Deshalb erhalten Variablen häufig kurze, kleingeschriebene Namen (etwa a, b oder c), damit sie nicht mit IDs verwechselt werden.
Wer gewinnt: die Variable, ohne jede Meldung
Ninox meldet nichts: Sobald der Code gespeichert ist, hat die Variable Vorrang vor dem Feld mit derselben ID. Ein Beispiel aus einer Datenbank, in der das Feld Number der Tabelle Sessions die ID B hat:
var B := 5;
cnt(select Sessions[Number = 1])Dieser Code wird in der Form (var B := 5; cnt(select A[B = 1])) gespeichert. Beim erneuten Lesen vergleicht der Filter nicht mehr das Feld Number mit 1, sondern die Variable B: Das Ergebnis ist 0, ohne Fehlermeldung. Mit [Number = 5] würde er alle Datensätze zählen; eine Sortierung order by Number würde den Nummern nicht mehr folgen. (Gemessen über die API, an einer Tabelle mit 48 Datensätzen.)
Die Falle zeigt sich erst nach dem Speichern: Ein Test des Textes, wie er angezeigt wird, also mit den Feldnamen (etwa eine über die API gesendete Abfrage), wird kompiliert und liefert das richtige Ergebnis. Im nach dem Speichern wieder gelesenen Code steht die ID B weiterhin im Klartext, wo vorher der Feldname stand: Das ist das Zeichen der Verwechslung (festgestellt im Code, den das Kommandozeilenwerkzeug von Ninox herunterlädt; im Code-Editor nicht überprüft).
Die einfachste Regel: niemals einen Variablen- oder Parameternamen aus einem oder zwei Großbuchstaben (B, KD, A1). Besser sind kleingeschriebene Namen, die sagen, was sie enthalten (firstDay, total).
