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
1per una tabella nuova e cresce di1a 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".
- Usate la funzione
- Esempio:
"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:
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:
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:
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):
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: vale3;- 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 connumber().
La trappola si incontra con un numero calcolato (record(Customer, total / 2) quando total è dispari) o ricevuto dall'esterno, per esempio tramite l'API.
"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.
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.)
