Déclarer des variables : var et let
var et let servent tous deux à déclarer une variable. Contrairement à JavaScript, il n'y a aucune différence de portée entre let et var dans Ninox.
Le type de la variable dépend du type de la valeur qui lui est affectée :
var t := "my text";
var b := false;
var n := 10;Une variable peut être déclarée plusieurs fois dans un même code. Dans ce cas, elle conserve le type et la valeur qui lui ont été affectés jusqu'à ce que la nouvelle déclaration soit atteinte :
var b := true;
dialog("Message 1", "Value of b: " + b, ["ok"]);
var b := 12;
dialog("Message 2", "Value of b: " + b, ["ok"]);Confusion entre noms de variables et identifiants de tables ou de champs
Ninox enregistre son code dans un format un peu différent de celui qui s'affiche à l'écran. Plus précisément, les noms de champs et de tables sont remplacés par leurs identifiants, qui sont des lettres.
Par exemple, le script suivant, qui calcule la somme des articles vendus :
sum('Invoice Items'.Total)sera enregistré dans le code système sous la forme suivante, où D est l'identifiant de la table 'Invoice Items' et E celui du champ Total :
sum(D.E)Dans ce contexte, si une variable D est créée, elle peut semer la confusion chez le compilateur : dans le code système ci-dessous, on ne sait plus si D.E désigne une table ou la variable D déclarée juste avant :
(var D := "hello"; sum(D.E))Pour éviter ce genre de confusion, donnez aux variables des noms qui ont peu de chances de coïncider avec des identifiants ou des noms de tables et de champs. C'est pourquoi les variables portent souvent des noms courts, en minuscules (par exemple a, b ou c), pour ne pas être confondues avec des identifiants.
Qui l'emporte : la variable, sans aucun message
Ninox ne signale rien : une fois le code enregistré, c'est la variable qui l'emporte sur le champ qui porte le même identifiant. Exemple, dans une base où le champ Number de la table Sessions a l'identifiant B :
var B := 5;
cnt(select Sessions[Number = 1])Ce code s'enregistre sous la forme (var B := 5; cnt(select A[B = 1])). Relu, le filtre ne compare plus le champ Number à 1, mais la variable B : le résultat est 0, sans erreur. Avec [Number = 5], il compterait toutes les fiches ; un tri order by Number ne suivrait plus les numéros. (Mesuré par l'interface de programmation, sur une table de 48 fiches.)
Le piège n'apparaît qu'après l'enregistrement : un essai du texte tel qu'il s'affiche, avec les noms des champs (une requête envoyée par l'interface de programmation, par exemple), compile et donne le bon résultat. Dans le code relu après l'enregistrement, l'identifiant B reste écrit en clair là où figurait le nom du champ : c'est le signe de la confusion (constaté dans le code téléchargé par l'outil en ligne de commande de Ninox ; non vérifié dans l'éditeur de code).
La règle la plus simple : jamais de nom de variable ni de paramètre fait d'une ou deux majuscules (B, KD, A1). Préférez des noms en minuscules qui disent ce qu'ils contiennent (firstDay, total).
