Korzystanie z identyfikatora rekordu

Identyfikatory rekordów w Ninox

  • Każdy nowy rekord w Ninox otrzymuje unikatowy identyfikator (ID).
  • Numeracja zaczyna się od 1 w nowej tabeli i rośnie o 1 przy każdym nowym wpisie (2, 3 itd.).
  • 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".
  • Przykład:
Ninox
"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:
Ninox
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:

Ninox
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:

Ninox
select Customer where id = "B1";

Wydobycie numeru rekordu z identyfikatora

Ta funkcja pozwala wyodrębnić numer rekordu z identyfikatora tekstowego (np. 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) 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.0 jest 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.

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

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.

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

(Zmierzone przez API, na tabeli z 8 rekordami.)