Deklarowanie zmiennych: var i let

Do zadeklarowania zmiennej można użyć zarówno var, jak i let. Inaczej niż w JavaScripcie, w Ninox nie ma między let a var żadnej różnicy zasięgu.

Typ zmiennej zależy od typu przypisanej do niej wartości:

Ninox
var t := "my text";
var b := false;
var n := 10;

Zmienną można zadeklarować kilkakrotnie w tym samym kodzie. Zachowuje ona wtedy przypisany typ i wartość aż do miejsca nowej deklaracji:

Ninox
var b := true;
dialog("Message 1", "Value of b: " + b, ["ok"]);
var b := 12;
dialog("Message 2", "Value of b: " + b, ["ok"]);

Mylenie nazw zmiennych z identyfikatorami tabel i pól

Ninox zapisuje swój kod w postaci nieco innej niż ta wyświetlana na ekranie. Konkretnie: nazwy pól i tabel są zastępowane ich identyfikatorami, czyli literami.

Na przykład poniższy skrypt, obliczający sumę sprzedanych pozycji:

Ninox
sum('Invoice Items'.Total)

zostanie zapisany w kodzie systemowym tak, gdzie D jest identyfikatorem tabeli 'Invoice Items', a E — identyfikatorem pola Total:

Ninox
sum(D.E)

W tym kontekście utworzenie zmiennej D może wprowadzić kompilator w błąd, ponieważ w poniższym kodzie systemowym nie byłoby jasne, czy D.E odnosi się do tabeli, czy do wcześniej zadeklarowanej zmiennej D:

Ninox
(var D := "hello"; sum(D.E))

Aby uniknąć takich pomyłek, zmiennym należy nadawać nazwy, które raczej nie pokryją się z identyfikatorami ani nazwami tabel i pól. Właśnie dlatego zmienne często noszą krótkie nazwy pisane małymi literami (np. a, b czy c) — żeby nie pomylić ich z identyfikatorami.

Co wygrywa: zmienna, bez żadnego komunikatu

Ninox niczego nie zgłasza: po zapisaniu kodu zmienna ma pierwszeństwo przed polem o tym samym identyfikatorze. Przykład z bazy, w której pole Number tabeli Sessions ma identyfikator B:

Ninox
var B := 5;
cnt(select Sessions[Number = 1])

Ten kod zostaje zapisany w postaci (var B := 5; cnt(select A[B = 1])). Po ponownym odczytaniu filtr nie porównuje już z 1 pola Number, lecz zmienną B: wynik wynosi 0, bez żadnego błędu. Przy [Number = 5] policzyłby wszystkie rekordy; sortowanie order by Number nie podążałoby już za numerami. (Zmierzone przez API, na tabeli z 48 rekordami.)

Pułapka ujawnia się dopiero po zapisaniu: test tekstu w postaci wyświetlanej, z nazwami pól (na przykład zapytanie wysłane przez API), kompiluje się i daje poprawny wynik. W kodzie odczytanym po zapisaniu identyfikator B pozostaje zapisany wprost tam, gdzie była nazwa pola: to znak pomyłki (stwierdzone w kodzie pobranym narzędziem wiersza poleceń Ninox; niesprawdzone w edytorze kodu).

Najprostsza zasada: nigdy nie należy nadawać zmiennej ani parametrowi nazwy złożonej z jednej lub dwóch wielkich liter (B, KD, A1). Lepiej używać nazw pisanych małymi literami, które mówią, co zawierają (firstDay, total).