Идентификатор записи

Идентификаторы записей в Ninox

  • Каждой новой записи в Ninox присваивается уникальный идентификатор (ID).
  • В новой таблице нумерация начинается с 1 и увеличивается на 1 с каждой новой записью (2, 3 и т. д.).
  • Идентификаторы удалённых записей повторно не используются. Поэтому наибольший идентификатор в таблице отражает общее число когда-либо созданных записей, включая удалённые и уже невидимые.
  • Представление идентификатора:
    • Идентификатор можно представить числом или текстом.
    • В текстовом виде идентификатор объединяет идентификатор таблицы (одна или несколько заглавных букв) с номером записи.
      Пример: "A1"

Что важно знать об идентификаторах

  • Преобразование идентификатора в текст:
    • Функция string() даёт текстовое представление идентификатора.
    • Функция text() возвращает текстом только числовую часть идентификатора. Например: "1".
  • Пример:
Ninox
"Correct textual representation, e.g. ""A1""";
string(maTable.id);
"Only the numeric part as text, e.g. ""1""";
text(maTable.id);
  • Идентификаторы в выражениях:
    • При арифметических действиях или объединении строк идентификатор принимает тип другого операнда.
  • Пример:
Ninox
var t := "Num ID: " + maTable.id;

Результат: Num ID: 1

Поиск записей по идентификатору

Чтобы получить запись по идентификатору в предложении where, можно использовать как число, так и текстовое представление.

С числом:

Ninox
select Customer where id = 1;

С текстом:

При использовании текста убедитесь, что идентификатор содержит и идентификатор таблицы, и номер записи.

Пример:

Ninox
select Customer where id = "B1";

Извлечение номера записи из идентификатора

Эта функция позволяет получить номер записи из текстового идентификатора (например, 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) преобразует идентификатор в текст.

Регулярное выражение ^[A-Z]+([0-9]+)$ означает:

  • ^[A-Z]+ → одна или несколько букв в начале,
  • ([0-9]+) → нужные нам цифры (группа захвата 1),
  • $ → конец строки.

extractx(..., "", "$1") возвращает только захваченные цифры.

number(...) превращает эту строку цифр в число.

Поиск записи с помощью record()

record(Table, n) сразу возвращает запись с номером n, не просматривая таблицу. Номер должен быть целым числом больше нуля:

  • дробное число (3.5), ноль или отрицательное число не возвращает ничего, без какого-либо сообщения: Ninox не округляет номер;
  • 3.0 принимается: оно равно 3;
  • текст ("3") или список ([3, 4]) отклоняется уже при написании формулы («Expression does not return a number», «Expression returns multiple values»): номер, полученный в виде текста, сначала нужно преобразовать с помощью number().

Эта ловушка встречается с вычисленным номером (record(Customer, total / 2), когда total нечётно) или с номером, полученным извне, например через 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"));

Внимание

Целое число, которому не соответствует ни одна запись (удалённая или ещё не созданная), не возвращает «ничего»: record() возвращает ссылку на отсутствующую запись. Поэтому if record(Customer, 999999) then истинно, тогда как if record(Customer, 3.5) then ложно.

Чтобы узнать, существует ли запись, проверьте её идентификатор: в обоих случаях он пуст.

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

(Измерено через API на таблице из 8 записей.)