Korzystanie z identyfikatora rekordu
Identyfikatory rekordów w Ninox
- Każdy nowy rekord w Ninox otrzymuje unikatowy identyfikator (ID).
- Numeracja zaczyna się od
1w nowej tabeli i rośnie o1przy każdym nowym wpisie (2,3itd.). - Usunięte identyfikatory nie są przydzielane ponownie. Najwyższy identyfikator w tabeli odzwierciedla więc łączną liczbę utworzonych rekordów, wraz z tymi, które usunięto i których już nie widać.
- Postać identyfikatora:
- Identyfikator może być przedstawiony jako liczba lub jako tekst.
- W postaci tekstowej łączy identyfikator tabeli (jedną lub kilka wielkich liter) z numerem rekordu.
Przykład:"A1"
Najważniejsze uwagi o identyfikatorach
- Zamiana identyfikatora na tekst:
- Funkcja
string()daje tekstową postać identyfikatora. - Funkcja
text()zwraca jako tekst wyłącznie część liczbową identyfikatora. Przykład:"1".
- Funkcja
- Przykład:
"Correct textual representation, e.g. ""A1""";
string(maTable.id);
"Only the numeric part as text, e.g. ""1""";
text(maTable.id);- Użycie identyfikatorów w wyrażeniach:
- Przy działaniach arytmetycznych lub łączeniu tekstu identyfikator przyjmuje typ drugiej wartości.
- Przykład:
var t := "Num ID: " + maTable.id;Wynik: Num ID: 1
Wyszukiwanie rekordów po identyfikatorze
Aby pobrać rekord po identyfikatorze w klauzuli where, można użyć liczby albo postaci tekstowej.
Z użyciem liczby:
select Customer where id = 1;Z użyciem tekstu:
Przy postaci tekstowej trzeba zadbać, aby identyfikator zawierał zarówno identyfikator tabeli, jak i numer rekordu.
Przykład:
select Customer where id = "B1";Wydobycie numeru rekordu z identyfikatora
Ta funkcja pozwala wyodrębnić numer rekordu z identyfikatora tekstowego (np. 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) zamienia identyfikator na tekst.
Wyrażenie regularne ^[A-Z]+([0-9]+)$ oznacza
^[A-Z]+→ jedną lub więcej liter na początku,([0-9]+)→ cyfry, o które nam chodzi (grupa przechwytująca 1),$→ koniec ciągu.
extractx(..., "", "$1") zwraca wyłącznie przechwycone cyfry.
number(...) zamienia ten ciąg cyfr na liczbę.
Wyszukiwanie rekordu za pomocą record()
record(Table, n) zwraca bezpośrednio rekord o numerze n, bez przeglądania tabeli. Numer musi być liczbą całkowitą większą od zera:
- liczba dziesiętna (
3.5), zero lub liczba ujemna nie zwraca niczego, bez żadnego komunikatu: Ninox nie zaokrągla numeru; 3.0jest akceptowane: równa się3;- tekst (
"3") lub lista ([3, 4]) zostaje odrzucony już przy pisaniu formuły („Expression does not return a number”, „Expression returns multiple values”): numer otrzymany jako tekst trzeba najpierw przekształcić za pomocąnumber().
Pułapka pojawia się przy numerze obliczonym (record(Customer, total / 2), gdy total jest nieparzyste) lub otrzymanym z zewnątrz, na przykład przez 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"));Uwaga
Liczba całkowita, której nie odpowiada żaden rekord (usunięty lub jeszcze nieutworzony), nie zwraca „niczego”: record() zwraca odwołanie do nieistniejącego rekordu. Dlatego if record(Customer, 999999) then jest prawdziwe, a if record(Customer, 3.5) then fałszywe.
Aby sprawdzić, czy rekord istnieje, należy sprawdzić jego identyfikator: w obu przypadkach jest pusty.
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(Zmierzone przez API, na tabeli z 8 rekordami.)
