V prvním díle této trilogie jsme si ukázali základy ORDA pomocí seznamů, entit a výběrů entit. Dnes půjdeme trochu hlouběji a spustíme několik dotazů, které budou využívat rekurzivní vztahy. Také se rychle podíváme na to, jak pěkně zobrazit seznamové boxy pomocí vlastnosti „metainformační výraz“.
Stáhnout Genealogie – druhý díl
scénář případu použití
Vybral jsem jednu osobu ve velmi rozsáhlém seznamu a nyní chci najít její rodiče a prarodiče. Chci také jejich sourozence … a děti, pokud nějaké mají! A proč ne tety a strýce … a bratrance a sestřenice?
Bude to všechno trvat celou věčnost? Tak to zjistíme.
Začněme od začátku!
Výběr entit people bude obsahovat osoby narozené po 1. lednu 1960 a bude uložen uvnitř objektu Form:
Form.people:=ds.PEOPLE.query("Birthday >= :1";!1960-01-01!).orderBy("Birthday asc, Lastname asc, Firstname asc")
Všimněte si tohoto velmi doporučeného formátu dotazu, používá zástupné znaky (:1) a parametry (!1960-01-01!).
NASTAVENÍ POLE SEZNAMU
Jak jsme viděli v předchozím příspěvku, na začátku je nastaven výběr entit(Form.people) jako vlastnost výběru entit.
Seznamové pole založené na výběru entity má několik nových vlastností. Popíšeme si tři z nich: Aktuální položka, Vybrané položky a Metainformační výraz.
Aktuální položka i Vybrané položky se budou automaticky aktualizovat, když uživatel změní výběr pole seznamu:
Aktuální položka bude obsahovat vybranou entitu (NEBO poslední přidanou entitu v případě vícenásobného výběru). Pokud v seznamu není vybrána žádná položka, bude tato entita nulová.
Vybrané položky jsou výběrem entit. Bude obsahovat všechny vybrané položky v seznamu, ať už byly vybrány jakýmkoli způsobem (shift+klik, control+klik atd.). Tento výběr entit bude vždy existovat, ale může být prázdný.
Výraz Metainformace je popsán níže na konci tohoto příspěvku.
ČLENOVÉ RODINY
Během události při změně výběru hlavního pole seznamu potřebujeme zjistit rodiče, děti a sourozence vybraných osob:
Form.parents:=GetParents (Form.persons)
Form .children:=GetChildren (Form.persons)
Form .siblings:=GetSiblings (Form.persons)
Jakmile pak vytvoříme tyto výběry entit, je vyhledání prarodičů, strýců a tet, stejně jako bratranců a sestřenic, opravdu snadné. Prarodiče jsou rodiče rodičů, strýcové a tety jsou sourozenci rodičů a bratranci a sestřenice jsou děti strýců a tet!
Form.grandParents:=GetParents (Form.parents)
Form .auntsAndUncles:=GetSiblings (Form.parents)
Form .cousins:=GetChildren (Form.auntsAndUncles)
Dotazy
Vyhledávání příbuzných členů je při použití ORDA opravdu snadné. Každá metoda „Get“ přijímá jako parametr výběr entit a vrací další výběr entit (na základě obsahu nebo přijatého).
Rodiče
Metoda GetParents obdrží jako parametr Form.parents hodnotu $1. Pojmenujme jej $_persons.
(Podtržítko je zde pouze jako vizuální pomůcka pro snadné rozlišení mezi „entitou“ a „výběrem entity“).
Jen připomínáme, že Matka a Otec jsou entity definované v definicích vztahů. Jsou to názvy vztahů „N až 1“.
Kouzlo ORDA spočívá v tom, že může vrátit buď jedinou entitu ($osoba.Matka, $osoba.Otec, $osoba.Partner), když se použije s jedinou entitou ($osoba), NEBO výběr entit, když se použije s jiným výběrem entit ($_osoby).
$_osoby:=$1
$_rodiče:=$_osoby.Matka.nebo($_osoby.Otec)
$0:=$_rodiče
děti
Totéž platí pro výběry entit definované pro vztahy „1 až n“.
// Note: the text below fits on a single line
$_děti:=$_osoby.DětiJakoOtec (...)
.or($_osoby.DětiJakoMatka) (...)
.orderBy("Birthday asc")
Sourozenci
U sourozenců musíme použít to více vztahů. Nejprve k nalezení Otce , pak k nalezení Dětí Otce, následuje logické„nebo“ aplikované na Matky, pak logické„minus“ k odstranění osob ze seznamu sourozenců(rodiče Pavla mají dva syny, Pavla a Jana, ale Pavel má jen jednoho bratra, Jana…).
// Note: the text below fits on a single line
$_sourozenci:=$_osoby.Otec.DětijakoOtec (...)
.or($_osob.Matka.DětijakoMatka) (...)
.minus($_osob)
Konečný výsledek
Nyní, když jsme našli členy rodiny podle kategorií, zobrazíme je v dalších oknech seznamu (se stejným druhem informací jako v hlavním poli seznamu). Pak už jen stačí zduplikovat seznamová pole a změnit názvy jejich vlastností pro výběr entit na Form.grandParents, Form.parents, Form.siblings, Form.children atd.
Metainformační výraz
Metainformační výraz je metoda 4D, která (obvykle) přijímá jako první parametr This a vrací objekt. Na obrázcích výše je tato metoda použita pro vykreslení modrého a růžového pozadí řádků.
Vrácený objekt má několik vlastností, které jsou definovány zde. V tomto případě používáme pouze vlastnost fill.
$person:=$1
$meta :=New object()
$even :=((($person.indexOf()%2)=0) // is it an even or and odd row ?
If ($person.Gender=True) // women
If ($even)
$meta .fill:="#FFF0F0" // women light
Else
$meta .fill:="#FFE8E8" // women a bit darker
End if
Else // man
If ($even)
$meta .fill:="#E8F8FF" // men light
Else
$meta .fill:="#E0F0FF"// men a bit darker
End if
End if
$0:=$meta
Závěr
Tato databáze obsahuje v podstatě SEDM řádků kódu!
První dotaz pro vyplnění Form.people, pak jeden řádek kódu uvnitř šesti metod „Get…“. Jednoduché a výkonné.
Tak proč mám pocit, že jsem na něco zapomněl? Ach ano … je to rychlé? Průměrná doba vyhledání šesti kategorií příbuzných pro jednu osobu v rámci skupiny mnoha tisíc dalších osob je přibližně 1 ms (testováno na počítači iMac 4,2Ghz Core i7 16Gb).
Pokud je výběr osob mnohem větší (řekněme 7284), je průměrný čas 6 ms.
Vyzkoušejte si to sami. Stáhněte si demoverzi a užívejte si ORDA !