Declarar variables: var y let
Tanto var como let sirven para declarar una variable. A diferencia de lo que ocurre en JavaScript, en Ninox no hay ninguna diferencia de ámbito entre let y var.
El tipo de la variable depende del tipo de valor que se le asigna:
var t := "my text";
var b := false;
var n := 10;Una variable se puede declarar varias veces en el mismo código. En ese caso, la variable conserva el tipo y el valor que se le habían asignado hasta que se llega a la declaración nueva:
var b := true;
dialog("Message 1", "Value of b: " + b, ["ok"]);
var b := 12;
dialog("Message 2", "Value of b: " + b, ["ok"]);Confusión entre nombres de variable e identificadores de tabla o de campo
Ninox guarda su código en un formato algo distinto del que se ve en pantalla. En concreto, los nombres de campo y de tabla se sustituyen por sus identificadores, que son letras.
Por ejemplo, el script siguiente, que calcula la suma de los artículos vendidos:
sum('Invoice Items'.Total)se guardará en el código del sistema de esta manera, donde D es el identificador de la tabla 'Invoice Items' y E el del campo Total:
sum(D.E)En este contexto, si se crea una variable D, puede confundir al compilador, porque en el código del sistema siguiente no quedaría claro si D.E designa una tabla o la variable D declarada antes:
(var D := "hello"; sum(D.E))Para evitar esa confusión, conviene dar a las variables nombres que difícilmente coincidan con identificadores o nombres de tablas y campos. Por eso se suele nombrar las variables con nombres cortos en minúsculas (por ejemplo, a, b o c), para que no se confundan con los identificadores.
Quién gana: la variable, sin ningún mensaje
Ninox no avisa de nada: una vez guardado el código, la variable se impone al campo que tiene el mismo identificador. Ejemplo, en una base de datos en la que el campo Number de la tabla Sessions tiene el identificador B:
var B := 5;
cnt(select Sessions[Number = 1])Este código se guarda con la forma (var B := 5; cnt(select A[B = 1])). Al releerlo, el filtro ya no compara el campo Number con 1, sino la variable B: el resultado es 0, sin ningún error. Con [Number = 5] contaría todos los registros; una ordenación order by Number ya no seguiría los números. (Medido mediante la API, en una tabla de 48 registros.)
La trampa solo aparece después de guardar: una prueba del texto tal como se muestra, con los nombres de los campos (una consulta enviada mediante la API, por ejemplo), compila y da el resultado correcto. En el código releído después de guardar, el identificador B sigue escrito tal cual donde estaba el nombre del campo: es la señal de la confusión (comprobado en el código descargado por la herramienta de línea de comandos de Ninox; no verificado en el editor de código).
La regla más sencilla: nunca un nombre de variable ni de parámetro formado por una o dos mayúsculas (B, KD, A1). Mejor nombres en minúsculas que digan lo que contienen (firstDay, total).
