Usare l'ID di un record

Gli ID dei record in Ninox

  • A ogni nuovo record Ninox assegna un ID (identificatore) univoco.
  • La numerazione parte da 1 per una tabella nuova e cresce di 1 a ogni nuova voce (2, 3, ecc.).
  • Gli ID eliminati non vengono riassegnati. L'ID più alto della tabella riflette quindi il numero totale di record creati, compresi quelli eliminati e non più visibili.
  • Rappresentazione dell'ID:
    • Gli ID si possono rappresentare come numeri o come testo.
    • Nella rappresentazione testuale, l'ID unisce l'ID della tabella (una o più lettere maiuscole) al numero del record.
      Esempio: "A1"

Note essenziali sugli ID

  • Convertire un ID in testo:
    • Usate la funzione string() per ottenere la rappresentazione testuale di un ID.
    • La funzione text() restituisce come testo solo la parte numerica dell'ID. Esempio: "1".
  • Esempio:
Ninox
"Correct textual representation, e.g. ""A1""";
string(maTable.id);
"Only the numeric part as text, e.g. ""1""";
text(maTable.id);
  • Usare gli ID nelle espressioni:
    • In un'operazione aritmetica o in una concatenazione, l'ID assume il tipo dell'altro dato.
  • Esempio:
Ninox
var t := "Num ID: " + maTable.id;

Risultato : Num ID: 1

Cercare i record per ID

Per recuperare un record in base all'ID in una clausola where, potete usare indifferentemente un numero o una rappresentazione testuale.

Con un numero:

Ninox
select Customer where id = 1;

Con del testo:

Usando il testo, assicuratevi che l'ID comprenda sia l'ID della tabella sia il numero del record.

Esempio:

Ninox
select Customer where id = "B1";

Estrarre il numero del record da un ID

Questa funzione permette di estrarre il numero del record da un ID testuale (per esempio 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) converte l'ID in testo.

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

  • ^[A-Z]+ → una o più lettere all'inizio,
  • ([0-9]+) → le cifre che ci interessano (gruppo di cattura 1),
  • $ → fine della stringa.

extractx(..., "", "$1") restituisce solo le cifre catturate.

number(...) converte quella stringa di cifre in un numero.

Trovare un record con record()

record(Table, n) restituisce direttamente il record numero n, senza scorrere la tabella. Il numero deve essere un intero maggiore di zero:

  • un numero decimale (3.5), lo zero o un numero negativo non restituisce nulla, senza alcun messaggio: Ninox non arrotonda il numero;
  • 3.0 è accettato: vale 3;
  • un testo ("3") o una lista ([3, 4]) viene rifiutato già mentre si scrive la formula («Expression does not return a number», «Expression returns multiple values»): un numero ricevuto come testo va prima convertito con number().

La trappola si incontra con un numero calcolato (record(Customer, total / 2) quando total è dispari) o ricevuto dall'esterno, per esempio tramite 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"));

Attenzione

Un numero intero che non corrisponde a nessun record (eliminato o non ancora creato) non restituisce «nulla»: record() restituisce un riferimento a un record assente. if record(Customer, 999999) then è quindi vero, mentre if record(Customer, 3.5) then è falso.

Per sapere se il record esiste, verificate il suo ID: è vuoto in entrambi i casi.

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

(Misurato tramite l'API, su una tabella di 8 record.)