In der ersten Folge dieser Trilogie haben wir die Grundlagen von ORDA anhand von Listenfeldern, Entitäten und Entitätsauswahlen demonstriert. Heute gehen wir etwas tiefer und führen einige Abfragen aus, die rekursive Beziehungen nutzen. Außerdem werfen wir einen kurzen Blick darauf, wie Listenfelder mithilfe der Eigenschaft „meta info expression“ ansprechend dargestellt werden können.
Download Genealogie – Episode zwei
Anwendungsszenario
Ich habe eine Person in einer sehr großen Liste ausgewählt und möchte nun ihre Eltern und Großeltern finden. Ich möchte auch ihre Geschwister … und Kinder, wenn sie welche haben! Warum nicht auch Tanten und Onkel … und Cousins und Cousinen?
Wird das alles eine Ewigkeit dauern? Finden wir es heraus.
Lassen Sie uns mit dem Anfang beginnen!
Die Auswahl der Entität people enthält Personen, die nach dem 1. Januar 1960 geboren sind, und wird im Objekt Form gespeichert:
Form.people:=ds.PEOPLE.query("Birthday >= :1";!1960-01-01!).orderBy("Birthday asc, Lastname asc, Firstname asc")
Beachten Sie dieses sehr empfohlene Abfrageformat, es verwendet Platzhalter (:1) und Parameter (!1960-01-01!).
EINRICHTEN DES LISTENFELDES
Wie wir im vorigen Beitrag gesehen haben, wird die Entitätsauswahl(Form.people) zu Beginn als Eigenschaft der Entitätsauswahl eingerichtet.
Das Listenfeld, das auf einer Entitätsauswahl basiert, hat eine Reihe neuer Eigenschaften. Wir werden drei von ihnen beschreiben: Aktuelles Element, Ausgewählte Elemente und Meta-Info-Ausdruck.
Sowohl das aktuelle Element als auch die ausgewählten Elemente werden automatisch aktualisiert, wenn der Benutzer die Auswahl in der Listbox ändert:
Das aktuelle Element enthält die ausgewählte Entität (ODER die zuletzt hinzugefügte Entität, falls mehrere ausgewählt wurden). Wenn in der Liste kein Element ausgewählt ist, ist dieses Element leer.
Der Eintrag Ausgewählte Elemente ist eine Auswahl von Entitäten. Sie enthält alle ausgewählten Elemente in der Liste, unabhängig davon, wie sie ausgewählt wurden (Umschalt+Klick, Control+Klick, etc.). Diese Entitätsauswahl ist immer vorhanden, kann aber auch leer sein.
Der Meta-Info-Ausdruck wird unten am Ende dieses Beitrags beschrieben.
FAMILIENMITGLIEDER
Während des Ereignisses “ on selection change “ des Hauptlistenfeldes müssen wir die Eltern, die Kinder und die Geschwister der ausgewählten Personen finden:
Form.parents:=GetParents (Form.persons)
Form .children:=GetChildren (Form.persons)
Form .siblings:=GetSiblings (Form.persons)
Sobald wir diese Entitätsauswahlen erstellt haben, ist die Suche nach Großeltern, Onkeln und Tanten sowie Cousins und Cousinen sehr einfach. Großeltern sind die Eltern der Eltern, Onkel und Tanten sind die Geschwister der Eltern, und Cousins und Cousinen sind die Kinder der Onkel und Tanten!
Form.grandParents:=GetParents (Form.parents)
Form .auntsAndUncles:=GetSiblings (Form.parents)
Form .cousins:=GetChildren (Form.auntsAndUncles)
Abfragen
Die Suche nach verwandten Mitgliedern ist wirklich einfach, wenn Sie ORDA verwenden. Jede „Get“-Methode empfängt eine Entitätsauswahl als Parameter und gibt eine andere Entitätsauswahl zurück (basierend auf dem Inhalt oder der empfangenen).
Eltern
Die Methode GetParents erhält Form.parents als Parameter $1. Nennen wir sie $_persons.
(Der Unterstrich dient hier nur als visuelle Hilfe, um die Unterscheidung zwischen „Entität“ und „Entitätsauswahl“ zu erleichtern).
Nur zur Erinnerung: Mutter und Vater sind die Entitäten, die in den Beziehungsdefinitionen definiert sind. Sie sind die Namen der „N zu 1“-Beziehungen.
Das Besondere an ORDA ist, dass es entweder eine einzelne Entität ($person.Mother, $person.Father, $person.Partner) zurückgeben kann, wenn es mit einer einzelnen Entität ($person) ODER einer Entitätsauswahl verwendet wird, wenn es mit einer anderen Entitätsauswahl ($_persons) verwendet wird.
$_persons:=$1
$_parents:=$_persons.Mutter.oder($_Personen.Vater)
$0:=$_Eltern
Kinder
Dasselbe gilt für Entitätsselektionen, die für die Beziehungen „1 bis n“ definiert sind.
// Note: the text below fits on a single line
$_Kinder:=$_Personen.KinderAlsVater (...)
.or($_persons.KinderAlsMutter) (...)
.orderBy("Geburtstag aufsteigend")
Geschwister
Für Geschwister müssen wir mehrere Beziehungen verwenden. Zuerst wird der Vater gefunden , dann die Kinder des Vaters, gefolgt von einem logischen„oder„, das auf die Mütter angewandt wird, dann ein logisches„minus„, um Personen aus der Geschwisterliste zu entfernen(die Eltern von Paul haben zwei Söhne, Paul und John, aber Paul hat nur einen Bruder, John…)
// Note: the text below fits on a single line
$_Geschwister:=$_Personen.Vater.KinderAlsVater (...)
.or($_Personen.Mutter.KinderAlsMutter) (...)
.minus($_Personen)
Endgültiges Ergebnis
Nun, da wir die Familienmitglieder nach Kategorien gefunden haben, zeigen wir sie in anderen Listenfeldern an (mit der gleichen Art von Informationen wie im Hauptlistenfeld). Dann müssen wir nur noch die Listenfelder duplizieren und ihre Eigenschaftsnamen für die Entitätsauswahl in Form.grandParents, Form.parents, Form.siblings, Form.children, usw. ändern.
Meta-Info-Ausdruck
Der Meta-Info-Ausdruck ist eine 4D Methode, die (normalerweise) This als ersten Parameter erhält und ein Objekt zurückgibt. In den obigen Bildern wird diese Methode verwendet, um blaue und rosa Zeilenhintergründe zu zeichnen.
Das zurückgegebene Objekt hat eine Reihe von Eigenschaften, die hier definiert werden. In diesem Fall ist die einzige Eigenschaft, die wir verwenden, 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
Schlussfolgerung
Diese Datenbank besteht im Wesentlichen aus SIEBEN Zeilen Code!
Die erste Abfrage, um Form.people zu füllen, dann eine Zeile Code innerhalb der sechs „Get…“-Methoden. Einfach und mächtig.
Warum habe ich also das Gefühl, dass ich etwas vergessen habe? Ach ja … ist es schnell? Die durchschnittliche Zeit, um die sechs Verwandtenkategorien für eine einzelne Person innerhalb einer Gruppe von vielen tausend anderen Personen zu finden, beträgt etwa 1 ms (getestet auf einem iMac 4.2Ghz Core i7 16Gb).
Wenn die Personenauswahl viel größer ist(sagen wir 7284), beträgt die durchschnittliche Zeit 6 ms.
Probieren Sie es selbst aus. Laden Sie die Demo herunter und genießen Sie ORDA!