Utiliser l'identifiant d'un enregistrement

Les identifiants d'enregistrement dans Ninox

  • Chaque nouvel enregistrement reçoit dans Ninox un identifiant (ID) unique.
  • La numérotation commence à 1 pour une table neuve et augmente de 1 à chaque nouvelle entrée (2, 3, etc.).
  • Les identifiants supprimés ne sont pas réattribués. L'identifiant le plus élevé de la table reflète donc le nombre total d'enregistrements créés, y compris ceux qui ont été supprimés et qui ne sont plus visibles.
  • Représentation d'un identifiant :
    • Les identifiants peuvent se présenter comme des nombres ou comme du texte.
    • Sous forme de texte, l'identifiant combine l'identifiant de la table (une ou plusieurs lettres majuscules) et le numéro de l'enregistrement.
      Exemple : "A1"

Points clés sur les identifiants

  • Convertir un identifiant en texte :
    • Utilisez la fonction string() pour obtenir la représentation textuelle d'un identifiant.
    • La fonction text() ne renvoie que la partie numérique de l'identifiant, sous forme de texte. 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);
  • Utiliser des identifiants dans des expressions :
    • Lors d'un calcul ou d'une concaténation, l'identifiant adopte le type de l'autre donnée.
  • Exemple :
Ninox
var t := "Num ID: " + maTable.id;

Résultat : Num ID: 1

Rechercher des enregistrements par identifiant

Pour récupérer un enregistrement par son identifiant dans une clause where, vous pouvez employer indifféremment un nombre ou une représentation textuelle.

Avec un nombre :

Ninox
select Customer where id = 1;

Avec du texte :

Avec du texte, veillez à ce que l'identifiant comprenne à la fois l'identifiant de la table et le numéro de l'enregistrement.

Exemple :

Ninox
select Customer where id = "B1";

Extraire le numéro d'enregistrement d'un identifiant

Cette fonction permet d'extraire le numéro d'enregistrement d'un identifiant textuel (par 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) convertit l'identifiant en texte.

L'expression régulière ^[A-Z]+([0-9]+)$ signifie

  • ^[A-Z]+ → une ou plusieurs lettres au début,
  • ([0-9]+) → les chiffres recherchés (groupe de capture 1),
  • $ → fin de la chaîne.

extractx(..., "", "$1") ne renvoie que les chiffres capturés.

number(...) convertit cette suite de chiffres en nombre.

Retrouver un enregistrement avec record()

record(Table, n) renvoie directement l'enregistrement numéro n, sans parcourir la table. Le numéro doit être un nombre entier supérieur à zéro :

  • un nombre décimal (3.5), zéro ou un nombre négatif ne renvoie rien, sans aucun message : Ninox n'arrondit pas le numéro ;
  • 3.0 est accepté : il vaut 3 ;
  • un texte ("3") ou une liste ([3, 4]) est refusé dès l'écriture de la formule (« Expression does not return a number », « Expression returns multiple values ») : un numéro reçu sous forme de texte se convertit d'abord avec number().

Le piège se rencontre avec un numéro calculé (record(Customer, total / 2) quand total est impair) ou reçu de l'extérieur, par l'interface de programmation par exemple.

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"));

Attention

Un nombre entier qui ne correspond à aucun enregistrement (supprimé, ou pas encore créé) ne renvoie pas « rien » : record() renvoie une référence vers un enregistrement absent. if record(Customer, 999999) then est donc vrai, alors que if record(Customer, 3.5) then est faux.

Pour savoir si l'enregistrement existe, testez son identifiant : il est vide dans les deux cas.

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

(Mesuré par l'interface de programmation, sur une table de 8 fiches.)