Fer servir l'identificador d'un registre

Els identificadors de registre a Ninox

  • A cada registre nou de Ninox se li assigna un ID (identificador) únic.
  • La numeració comença per 1 en una taula nova i s'incrementa d'1 a cada entrada nova (2, 3, etc.).
  • Els identificadors suprimits no es tornen a assignar. Per tant, l'ID més alt de la taula reflecteix el nombre total de registres creats, incloent-hi els que s'han suprimit i ja no es veuen.
  • Representació dels identificadors:
    • Els identificadors es poden representar com a nombres o com a text.
    • Quan es representen com a text, l'ID combina l'ID de la taula (una o més lletres majúscules) amb el número del registre.
      Exemple: "A1"

Punts clau sobre els identificadors

  • Convertir un ID en text:
    • Feu servir la funció string() per obtenir una representació textual d'un ID.
    • La funció text() només retorna la part numèrica de l'ID en forma de text. Exemple: "1".
  • Exemple:
Ninox
"Correct textual representation, e.g. ""A1""";
string(maTable.id);
"Only the numeric part as text, e.g. ""1""";
text(maTable.id);
  • Fer servir els identificadors en expressions:
    • En una operació aritmètica o en una concatenació, l'ID adopta el tipus de l'altra dada.
  • Exemple:
Ninox
var t := "Num ID: " + maTable.id;

Resultat: Num ID: 1

Cercar registres per ID

Per recuperar un registre per ID en una clàusula where, podeu fer servir tant un nombre com una representació de text.

Amb un nombre:

Ninox
select Customer where id = 1;

Amb text:

Quan feu servir text, assegureu-vos que l'ID inclogui tant l'ID de la taula com el número del registre.

Exemple:

Ninox
select Customer where id = "B1";

Extreure el número de registre d'un ID

Aquesta funció us permet extreure el número de registre d'un ID en forma de text (per exemple, 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) converteix l'ID en text.

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

  • ^[A-Z]+ → una o més lletres al començament,
  • ([0-9]+) → les xifres que volem (grup de captura 1),
  • $ → final de la cadena.

extractx(..., "", "$1") retorna només les xifres capturades.

number(...) converteix aquesta cadena de xifres en un nombre.

Trobar un registre amb record()

record(Table, n) retorna directament el registre número n, sense recórrer la taula. El número ha de ser un enter més gran que zero:

  • un nombre decimal (3.5), el zero o un nombre negatiu no retorna res, sense cap missatge: Ninox no arrodoneix el número;
  • 3.0 s'accepta: val 3;
  • un text ("3") o una llista ([3, 4]) es rebutja tan bon punt s'escriu la fórmula («Expression does not return a number», «Expression returns multiple values»): un número rebut com a text s'ha de convertir primer amb number().

El parany apareix amb un número calculat (record(Customer, total / 2) quan total és senar) o rebut de fora, per exemple a través de l'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ó

Un nombre enter que no correspon a cap registre (suprimit o encara no creat) no retorna «res»: record() retorna una referència a un registre absent. Per tant, if record(Customer, 999999) then és cert, mentre que if record(Customer, 3.5) then és fals.

Per saber si el registre existeix, comproveu-ne l'identificador: és buit en tots dos 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

(Mesurat mitjançant l'API, en una taula de 8 registres.)