Tablice w Ninox

Tablice proste

Operowanie na tablicach tekstów lub liczb jest proste:

var myArray := ["a", "b", "d"];

index(myArray, "b");
myArray := array(myArray, ["c"]);

myArray order this;

Sortowanie można też wykonać za pomocą order, sort i unsort dla tablic tekstowych lub liczbowych.
Więcej funkcji związanych z tablicami znajdą Państwo w dokumentacji Ninox.

Tablice dwuwymiarowe

Ninox nie obsługuje bezpośrednio tablic dwuwymiarowych. Zamiast nich należy użyć tablicy obiektów JSON.
Na przykład sortowanie tablicy według drugiego elementu pola d2:

var myArray := [{'d2':["a", "Z"]}, {'d2':["b", "B"]}, {'d2':["c", "C"]}, {'d2':["d", "D"]}];

(myArray order by item('d2', 1));

Ten kod zwraca: [{"d2":["b","B"]},{"d2":["c","C"]},{"d2":["d","D"]},{"d2":["a","Z"]}]

Filtrowanie tablic

Tablice można filtrować podobnie jak wynik instrukcji select. W tablicach tekstowych i liczbowych używa się this do odwołania się do filtrowanej wartości:

var myArray := ["Jan", "Fred", "Jacques"];
myArray[this like "J"] order this;

W tablicach JSON używa się bezpośrednio klucza:

var myArray := [
  { 'prénom' : "Jan", nom : "Augustin" },
  { 'prénom' : "Fred", nom : "Baillot" },
  { 'prénom' : "Jacques", nom : "Tur" }
];

myArray[nom like "i"] order 'prénom';

Ten kod zwraca tablicę JSON: [{"prénom":"Fred","nom":"Baillot"}, {"prénom":"Jan","nom":"Augustin"}]

Własne operacje na tablicach JSON

W tablicach JSON można umieścić blok kodu (w nawiasach), aby wykonać własne operacje przy każdej iteracji. Podobnie jak w for in, typ wynikowej tablicy odpowiada ostatniemu wierszowi kodu w bloku.

Przykład: obliczenie długości pełnych imion i nazwisk (prénom + nom):

var myArray := [
  { 'prénom' : "Leo", nom : "Martin" },
  { 'prénom' : "Paul", nom : "Garnet" },
  { 'prénom' : "Pierre", nom : "Dur" }
];

var nameLengths := myArray[nom like "a"].(
    var fullName := ---{'prénom'} {nom}---;
    length(fullName)
);
nameLengths;

Ten kod zwraca tablicę liczb [10, 11] odpowiadających długościom pełnych imion i nazwisk.

Inicjalizacja pustej tablicy z typem

W Ninox zwykłą sztuczką na utworzenie pustej tablicy, która mimo to niesie właściwy typ rekordu, jest wykonanie instrukcji select z filtrem where false.
Zapytanie zwraca zero rekordów, ale zachowuje typ elementów tablicy.

"Empty Invoice Item array:";
let t := (select 'Invoice Item' where false);
  • t jest teraz tablicą, której elementy są typu Invoice Item.
  • Ponieważ jest pusta, a jednocześnie otypowana, można jej bezpiecznie użyć jako punktu wyjścia dla operacji array().

Dlaczego nie po prostu []?

Literał [] to tablica bez typu. Często działa, ale w połączeniu z array() na zbiorach rekordów Ninox może zgłaszać niezgodność typów.
Wzorzec select … where false całkowicie omija ten problem.

Tworzenie pustej tablicy dla typów prostych (liczba, tekst, JSON…)

Gdy potrzebna jest pusta tablica wartości skalarnych — liczb, ciągów tekstowych lub obiektów JSON — nie ma tabeli, z której można by zrobić select.
Nadal jednak można uzyskać otypowaną pustą tablicę, zasiewając [] sztucznym elementem i natychmiast go odfiltrowując:

"Empty number / text / JSON array:";
let t := [1][false];   "t is now an empty but number typed array";

[1] tworzy jednoelementową tablicę liczbową; filtr [false] usuwa ten element, pozostawiając pustą tablicę, która zachowuje typ number.
Jeśli potrzebują Państwo tekstu lub JSON, zamiast 1 należy użyć literału odpowiedniego typu.

Spłaszczanie tablicy dwuwymiarowej

Każda faktura (Invoice) zawiera własną podtablicę Invoice Items. Aby otrzymać jedną listę ze wszystkimi pozycjami wszystkich faktur, należy przejść po fakturach i połączyć ich podtablice.

"Initialize empty array:";
let t := (select 'Invoice Item' where false);

"Iterate over each invoice and add its items:";
for i in Invoices do
    t := array(t, i.'Invoice Items')
end;

"Return the flattened list:";
t

Jak to działa

  1. for i in Invoices do … end przechodzi po każdym rekordzie Invoice.
  2. array(t, i.'Invoice Items') łączy bieżącą wartość t z tablicą pozycji tej faktury.
    • Przy pierwszej iteracji dopisywane są pozycje pierwszej faktury.
    • Przy drugiej iteracji dodawane są pozycje drugiej faktury i tak dalej.
  3. Po zakończeniu pętli t zawiera wszystkie pozycje ze wszystkich faktur w jednej, płaskiej tablicy.

Można teraz wykonywać operacje takie jak count(t), aby poznać łączną liczbę pozycji, albo bezpośrednio przechodzić po t lub ją filtrować.