ORDA – Genealogie – druhý díl

Automaticky přeloženo z Deepl

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á.

blank

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ý.

blank

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.

blank

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).

blank

Pokud je výběr osob mnohem větší (řekněme 7284), je průměrný čas 6 ms.

blank

Vyzkoušejte si to sami. Stáhněte si demoverzi a užívejte si ORDA !

Roland Lannuzel
- Product Owner & 4D Expert - Po studiu elektroniky se Roland věnoval průmyslovým IT jako vývojář a konzultant, který vytvářel řešení pro zákazníky s různými databázemi a technologiemi. Koncem 80. let se zamiloval do 4D a používal jej při psaní podnikových aplikací, které zahrnovaly účetní, fakturační a e-mailové systémy. nakonec se připojil ke společnosti v roce 1997 a Rolandův cenný přínos zahrnuje návrh specifikací, testovacích nástrojů, demoverzí a také školení a přednášky pro komunitu 4D na mnoha konferencích. Nadále aktivně utváří budoucnost 4D definováním nových funkcí a nástrojů pro vývoj databází.