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:

Ninox
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:

Ninox
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:

Ninox
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:

Ninox
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:

Ninox
(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:

Ninox
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).