Идентификатор записи
Идентификаторы записей в Ninox
- Каждой новой записи в Ninox присваивается уникальный идентификатор (ID).
- В новой таблице нумерация начинается с
1и увеличивается на1с каждой новой записью (2,3и т. д.). - Идентификаторы удалённых записей повторно не используются. Поэтому наибольший идентификатор в таблице отражает общее число когда-либо созданных записей, включая удалённые и уже невидимые.
- Представление идентификатора:
- Идентификатор можно представить числом или текстом.
- В текстовом виде идентификатор объединяет идентификатор таблицы (одна или несколько заглавных букв) с номером записи.
Пример:"A1"
Что важно знать об идентификаторах
- Преобразование идентификатора в текст:
- Функция
string()даёт текстовое представление идентификатора. - Функция
text()возвращает текстом только числовую часть идентификатора. Например:"1".
- Функция
- Пример:
"Correct textual representation, e.g. ""A1""";
string(maTable.id);
"Only the numeric part as text, e.g. ""1""";
text(maTable.id);- Идентификаторы в выражениях:
- При арифметических действиях или объединении строк идентификатор принимает тип другого операнда.
- Пример:
var t := "Num ID: " + maTable.id;Результат: Num ID: 1
Поиск записей по идентификатору
Чтобы получить запись по идентификатору в предложении where, можно использовать как число, так и текстовое представление.
С числом:
select Customer where id = 1;С текстом:
При использовании текста убедитесь, что идентификатор содержит и идентификатор таблицы, и номер записи.
Пример:
select Customer where id = "B1";Извлечение номера записи из идентификатора
Эта функция позволяет получить номер записи из текстового идентификатора (например, 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) преобразует идентификатор в текст.
Регулярное выражение ^[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.
"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 ложно.
Чтобы узнать, существует ли запись, проверьте её идентификатор: в обоих случаях он пуст.
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 записей.)
