Usar el identificador de un registro

Los identificadores de registro en Ninox

  • A cada registro nuevo de Ninox se le asigna un ID (identificador) único.
  • La numeración empieza en 1 en una tabla nueva y se incrementa en 1 con cada entrada nueva (2, 3, etc.).
  • Los identificadores eliminados no se reutilizan. Por tanto, el ID más alto de la tabla refleja el número total de registros creados, incluidos los que se eliminaron y ya no se ven.
  • Representación del ID:
    • Los identificadores se pueden representar como números o como texto.
    • Cuando se representan como texto, el ID combina el identificador de la tabla (una o varias letras mayúsculas) con el número de registro.
      Ejemplo: "A1"

Puntos clave sobre los identificadores

  • Convertir un ID en texto:
    • Use la función string() para obtener una representación textual de un ID.
    • La función text() solo devuelve como texto la parte numérica del ID. Ejemplo: "1".
  • Ejemplo:
Ninox
"Correct textual representation, e.g. ""A1""";
string(maTable.id);
"Only the numeric part as text, e.g. ""1""";
text(maTable.id);
  • Usar los identificadores en expresiones:
    • Al hacer operaciones aritméticas o concatenaciones, el ID adopta el tipo del otro dato.
  • Ejemplo:
Ninox
var t := "Num ID: " + maTable.id;

Resultado: Num ID: 1

Buscar registros por su identificador

Para recuperar un registro por su ID en una cláusula where, puede usar tanto un número como una representación textual.

Con un número:

Ninox
select Customer where id = 1;

Con texto:

Cuando use texto, asegúrese de que el ID incluya tanto el identificador de la tabla como el número de registro.

Ejemplo:

Ninox
select Customer where id = "B1";

Extraer el número de registro de un identificador

Esta función permite extraer el número de registro de un ID en forma de texto (por ejemplo, A1):

Ninox
function recordNumber(id : text) do
  "Capture the digit group.";
  number(extractx(id, "^[A-Z]+([0-9]+)$", "", "$1"))
end;

"Example: apply to the current record’s ID";
var numId := recordNumber(string(myId));

string(myId) convierte el ID en texto.

La RegExp ^[A-Z]+([0-9]+)$ significa

  • ^[A-Z]+ → una o varias letras al principio,
  • ([0-9]+) → las cifras que buscamos (grupo de captura 1),
  • $ → fin de la cadena.

extractx(..., "", "$1") devuelve únicamente las cifras capturadas.

number(...) convierte esa cadena de cifras en un número.

Encontrar un registro con record()

record(Table, n) devuelve directamente el registro número n, sin recorrer la tabla. El número debe ser un entero mayor que cero:

  • un número decimal (3.5), el cero o un número negativo no devuelve nada, sin ningún mensaje: Ninox no redondea el número;
  • 3.0 se acepta: vale 3;
  • un texto ("3") o una lista ([3, 4]) se rechaza en cuanto se escribe la fórmula («Expression does not return a number», «Expression returns multiple values»): un número recibido como texto debe convertirse primero con number().

La trampa aparece con un número calculado (record(Customer, total / 2) cuando total es impar) o recibido desde fuera, por ejemplo a través de la API.

Ninox
"Found: record number 3";
record(Customer, 3);
"Nothing, and no error: Ninox does not round";
record(Customer, 3.5);
"A number received as text must be converted first";
record(Customer, number("3"));

Atención

Un número entero que no corresponde a ningún registro (eliminado o aún no creado) no devuelve «nada»: record() devuelve una referencia a un registro ausente. Por eso if record(Customer, 999999) then es verdadero, mientras que if record(Customer, 3.5) then es falso.

Para saber si el registro existe, compruebe su identificador: está vacío en ambos casos.

Ninox
var n := 3.5;
if record(Customer, n).id then
  "The record exists"
else
  "No record: n is not a whole number greater than zero, or no record has this number"
end

(Medido mediante la API, en una tabla de 8 registros.)