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);
tjest 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
for i in Invoices do … endprzechodzi po każdym rekordzie Invoice.array(t, i.'Invoice Items')łączy bieżącą wartośćtz tablicą pozycji tej faktury.- Przy pierwszej iteracji dopisywane są pozycje pierwszej faktury.
- Przy drugiej iteracji dodawane są pozycje drugiej faktury i tak dalej.
- Po zakończeniu pętli
tzawiera 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ć.
