Die Darstellung eines Familienstammbaums ist keine ganz triviale Aufgabe. Besonder wichtig ist, beim Wechsel zwischen einzelnen Personen, bzw. Generationen die Übersicht nicht zu verlieren.
Im vorgelegten Artikel wird eine Lösung im Microsoft-Access präsentiert. Sie stellt ein praktisches Beispiel des relationalen Datenmodells und der Verwendung der SQL-Ausdrücke in Formularsteuerelementen dar.
Die Grundidee des vorgestellten Programms besteht darin, die ganze Verwandschaft einer Person über drei Generationen (Eltern, Geschwister, Partner und Kinder) gleichzeitig in ein Formular hineinzubringen. Jede angezeigte Person kann (meistens mit Doppelklick) zur zentralen Person ausgewählt werden. Die Anzeige und Bezeichnung der Verwandten ändert sich dann dementsprechend automatisch. Wenn Sie zum Beispiel auf ein Kind doppelklicken, erscheint die vorher angezeigte Person als Mutter oder Vater und das Kind steht in der Mitte des Formulars.
Außer der Grunddaten (Name, Geburts-, bzw. Sterbedatum) und der Beziehungen können zu jeder Person zusätzliche Angaben gespeichert werden. Erstens sind es Informationen über die Wohnorte, zweitens Lebensereignisse oder beliebige andere Notizen. Sie können mit einem Datumsintervall versehen werden und können einen beliebig langen Text enthalten (Memo-Feld).
Nachdem Sie die Datenbank Familie.mdb mit Access (ab der Version 97) öffnen, erscheint das Hauptformular. Es besteht aus mehreren Unterformularen. In ihnen werden die Personen mit einer bestimmten Beziehung zur zentralen Person und die Wohnorte und Ereignisse dargestellt.
Alle Steuerelemente des Formulars sind mit den Quickinfo-Texten versehen. Damit wird die Bedienung erleichtert.
Beachten Sie, dass einige Teile der Formulars farbig sind. Durch die blaue, bzw. rosarote Farbe wird das Geschlecht der Personen hervorgeghoben.
Die zur Verfügung gestellten Testdaten stellen keine konkrete Familie dar. Für die bessere Anschaulichkeit enthalten die Nachnamen direkt die Familienbeziehungen zu der Testperson. Die Datums- und Ortsangaben sind leer, weil sie für die Präsentation der Funktionalität des Programms irrelevant sind.
Als zentrale Person wird diejenige Person bezeichnet, die in der Mitte der linken Hälfte des Formulars angezeigt wird. Auf diese Person beziehen sich die Bezeichnungen der anderen Beziehungen und die Informationen über Wohnorte und Ereignisse. Alle angezeigten Felder außer Geschlecht (wird nur beim Anlegen einer neuen Person eingegeben) sind editierbar. Die Person kann mit der entsprechenden Schaltfläche nach Abfrage gelöscht werden.
Nach dem Programmstart wird die erste Person, die in der Personentabelle gespeichert wurde, angezeigt.
Es gibt zwei Wege, wie Sie eine andere Person als zentrale Person anzeigen können:
· Mit Hilfe der Combobox in der linken oberen Ecke (nur das Rechteck mit Pfeil ist sichtbar) können Sie eine beliebige Person direkt aus allen bereits gespeicherten Personen auswählen. In der Auswahlliste werden Nachname, Vorname, Titel und Geburtsdatum angezeigt.
· Mit dem Doppelklick auf eine Person aus Geschwistern, Partnern oder Kindern, bzw. mit dem einfachen Klick auf die Schaltflächen beim Vater oder Mutter können Sie die jeweilige Person zur zentralen machen.
Nachdem die zentrale Person geändert wurde, wird die Anzeige aller anderen Familienmitglieder sofort dementsprechend geändert.
Nachdem Sie die Schalfläche Neue Person anklicken, werden alle Teile der Formulars (bis auf den zentralen) ausgeblendet und Sie können die Daten einer neuen Person eintragen. Es muß mindestens der Nachname und das Geschlecht eingegeben werden. Nach dem Speichern bleibt die zuletzt gespeicherte Person als zentrale Person angezeigt. Die restlichen Teile des Formulars bleiben leer, weil noch keine Beziehung und keine zusätzlichen Informationen (Wohnorte, Ereignisse) eingegeben sind.
Jede Person bekommt ihren richtigen Platz in der Familienhierarchie, indem ihr der Vater und die Mutter zugeordnet werden. Es wird davon ausgegangen, dass die Eltern als Personen mit dem oben erklärten Verfahren bereits angelegt wurden.
In der rechten oberen Ecke des zentralen Teils befinden sich zwei Comboboxe (wieder ohne das Eingabefeld) für die Zuordnung der Mutter und des Vaters. Es werden natürlich nur Personen mit dem richtigen Geschlecht zur Auswahl angeboten. Nachdem Sie beide Elternteile definiert haben, können Sie sofort alle anderen bereits verfügbaren Verwandten sehen.
Die Zuordnung der Mutter oder des Vaters können Sie entweder jederzeit ändern oder mit den kleinen Schaltflächen neben den Comboboxen entfernen.
Nachdem Sie in der Mitte der rechten Formularhälfte auf die Schaltfläche Partner klicken, wird das Formular Partnerschaft geöffnet. Hier können Sie der zentralen Person einen oder mehrere Partner zuordnen und das Datum und Ort der Eheschließung, bzw. das Scheidungsdatum eintragen.
Es wird vorausgesetzt, dass der Partner/Partnerin vorher als eine Person gespeichert wurde.
Damit die Adressen nicht mehrmals für mehrere zusammenlebende Personen eingegeben werden müssen, werden sie getrennt von der Zuordnung zur Person gespeichert. Die Struktur ist ersichtlich, wenn Sie mit der Schalfläche Wohnorte das Formular Wohnort öffnen. In der Combobox oben können Sie die bereits gespeicherten Adressen auswählen und das Von- , bzw. Bis-Datum eintragen.
Die Verwaltung der Adressen wird in einem getrennten Formular durchgeführt, das Sie mit der Schaltfläche Adressen öffnen können. Die in diesem Formular eingegebenen Daten sind von den Personenangaben unabhängig. Erst in dem Formular Wohnort werden sie der jeweiligen Person zugeordnet.
Das Formular Ereignis ist für das Speichern von beliebigen Lebensereignissen oder anderen Notizen bestimmt. Auf dem Hauptformular werden das Titel und das Von- , bzw. Bis-Datum angezeigt. Außerdem können Sie zu jedem Eintrag noch einen beliebig langen Text (Memofeld) speichern.
Sowohl die Wohnorte als auch die Ereignisse werden immer der Person zugerordnet, die bereits als die zentrale Person angezeigt wird.
Für die richtige und zuverlässige Definition der Familienbeziehungen ist es notwendig, jede Person mittels eines eindeutigen Schlüssels zu indentifizieren. Aus diesem Grund wurde in der Tabelle tblPerson ein Autowert-Feld lPerson als primärer Schlüssel erstellt, das die automatische Nummerierung der Personen garantiert.
Der Präfix "l" steht für Datentyp Long Integer und wird für alle Felder verwendet, die den Verweis auf eine Person darstellen. Darüber erfahren Sie mehr bei der Beschreibung von einzelnen Tabellen der Applikation.
In der Tabelle tblPerson werden alle Angaben zu einer Person und die Zuordnung zur Mutter und zum Vater gespeichert. Sie enthält folgende Felder:
Feldname |
Typ |
Bedeutung |
lPerson |
Autowert |
Primärer Schlüssel |
lMutter |
LongInt |
Schlüssel der Mutter |
lVater |
LongInt |
Schlüssel des Vaters |
sNachname |
Text |
|
sVorname |
Text |
|
sTitel |
Text |
|
sGebNachname |
Text |
GeburtsNachname |
iGeschlecht |
Integer |
1=Mann, 2=Frau |
dtmGeburtstag |
Datum |
|
sGeburtsort |
Text |
|
dtmSterbetag |
Datum |
|
sSterbeort |
Text |
|
Mit der bereits vorgestellten Personentabelle kann eigentlich die Familienhierarchie mit Eltern und Kindern einer Person abgebildet werden, wenn bei jeder beteiligten Person die Felder lMutter und lVater mit den richtigen Personenschlüsseln befüllt werden.
Für die Abbildung einer Partnerschaft brauchen wir eine weitere Tabelle, welche in einem Datensatz zwei zusammengehörende Personenschlüssel speichern kann. Diese Tabelle heißt tblPartner und hat folgende Struktur:
Feldname |
Typ |
Bedeutung |
lMann |
LongInt |
Schlüssel des Mannes |
lFrau |
LongInt |
Schlüssel der Frau |
dtmVon |
Datum |
Datum der Eheschließung |
sOrtVon |
Text |
Ort der Eheschließung |
dtmBis |
Datum |
Datum der Scheidung |
Im Sinne des relationellen Datenmodells handelt es sich in diesem Fall um eine Tabelle, die die Tabellenbeziehung M:N vermittelt (sowohl Männer als auch Frauen können Beziehungen mit mehreren Personen bilden).
Die Adressentabelle erfordert keine besondere Erklärung. Sie enthält ein Autowert-Feld lAdresse, welches den primären Schlüssel darstellt. Sein Wert tritt in der Wohnort-Tabelle als fremder Schlüssel auf, um auf die Adresse zu verweisen.
Feldname |
Typ |
Bedeutung |
lAdresse |
AutoWert |
Primärer Schlüssel |
sStraßeNr |
Text |
|
lPLZ |
LongInt |
|
sOrt |
Text |
|
sLand |
Text |
|
sTelefon |
Text |
|
Die Tabelle tblWohnort hat eine ähnliche Funktion wie die Tabelle tblPartner. Sie speichert die primären Schlüssel der Tabellen tblPerson und tblAdresse, die in einer M:N Beziehung stehen. In der Tabelle wird zusätzlich noch die Dauer dieser Beziehung (Gültigkeit des jeweiligen Wohnortes) abgespeichert.
Feldname |
Typ |
Bedeutung |
lPerson |
LongInt |
Schlüssel der Person |
lAdresse |
LongInt |
Schlüssel der Adresse |
dtmVon |
Datum |
|
dtmBis |
Datum |
|
Die Ereignistabelle kann mehrere Lebensereignisse (oder beliebige andere Informationen) zu einer Person speichern. Es wird nicht vorausgesetzt, dass wie bei Adressen mehrere Personen die gleichen Ereignisse teilen. Aus diesem Grund ist hier eine 1:N Beziehung ohne eine zusätzliche Tabelle (wie tblPartner oder tblWohnort) realisiert.
Die Struktur ist einfach und übesichtlich. Der einzige Schlüsselwert ist der fremde Schlüssel lPerson, der die Verbindung zu einer Person darstellt.
Feldname |
Typ |
Bedeutung |
lPerson |
LongInt |
Schlüssel der Person |
sEreignis |
Text |
Titel |
dtmVon |
Datum |
|
dtmBis |
Datum |
|
memText |
Memo |
Zusatzinfo |
Ausgehend aus den bereits vorgestellten Tabellenstrukturen können die grundlegenden Zusammenhänge zwischen den Schlüsselwerten abgeleitet werden:
· Als Vater, bzw. Mutter wird diejenige Person angezeigt, derer Schlüssel im Feld lVater oder lMutter der zentralen Person steht.
· Prinzipiell die gleiche Regel gilt für die Kinder: es sind die Personen, die im Feld lVater oder lMutter den Schlüssel der zentralen Person enthalten.
· Geschwister sind diejenige Personen, die mindenstens in einem der Felder lVater oder lMutter den gleichen Wert wie die zentrale Person enthalten.
· Partner werden mittels der Tabelle tblPartner identifiziert. Es werden alle Personen aufgelistet, derer Schlüssel in gleichen Datensätzen wie der Schlüssel der zentralen Person steht.
· Anzeige der Wohnorte und Ereignisse ist einfach. Die Datensätze, die den Schlüssel der zentralen Person enthalten, werden aufgelistet.
Auf dem folgenden Bild können Sie die bereits angeführten Zusammenhänge anschaulich sehen. Das Bild ist als Entwurfsicht einer Abfrage erstellt worden. Diese Abfrage steht zwar in der gelieferten Datenbank zur Verfügung, ist aber nicht für eine Datenanzeige bestimmt und wird auf im Programm als Abfrage nicht eingesetzt.
Alle dargestellten Tabellen außer der Partnerschaftstabelle sind als unterschiedliche Datesätze der gleichen Personentabelle zu verstehen.
Die Funktionalität des Programms besteht grundsätzlich aus einer Menge von Datenselektionen und Anzeige der Ergebnisse in Unterformularen je nach der Bezeihung zu der bereits angezeigten zentralen Person. Die für die Selektion notwendigen SQL-Ausdrücke sind meistens direkt als Datenherkunft des jeweiligen Formulars oder Steuerelements im Eigenschaftsfenster eingetragen. Nur in drei Fällen, wenn mehrere Tabellen verknüpft werden, wurden die Selektionen als benannte Abfragen definiert.
Das Hauptformular frmHaupt ist an die Tabelle tblPerson gebunden, obwohl keine Datenfelder im Formular direkt angezeigt oder bearbeitet werden. Anzeige aller gespeicherten Daten erfolgt in Unterformularen, die den jeweiligen Teil der Familienhierarchie, bzw. die Zusatzangaben (Wohnorte und Ereignisse) samt der notwendigen Steuerelementen enthalten.
Der primäre Schlüssel der zentralen Person ist das wichtigste Selektionskriterium. Alle angezeigten Familienemitglieder, bzw. ihre Position in der Hierarchie werden im Bezug auf die zentrale Person selektiert.
In den SQL-Selektionsausdrücken wird folgende Referenz auf das Haupformularfeld, bzw. Datenfeld der Personentabelle verwendet:
Forms!frmHaupt!lPerson
Alle Formulare, in denen neue Datensätze im Bezug auf die zentrale Person angelegt werden, übernehmen in der Ereignis-Prozedur BeforeInsert den o.g. Wert des Personenschlüssels in den neu erstellten Datensatz. Es betrifft die Formulare frmPartner, frmWohnort und frmEreignis, die später noch diskutiert werden.
Sub Form_BeforeInsert(Cancel As Integer)
Me!lPerson = Forms!frmHaupt!lPerson
End Sub
Nachdem eine neue zentrale Person ausgewählt wird, wird die Funktion SelectPerson() aufgerufen. Ihre Aufgabe besteht darin, die Daten für das Hauptformular zu filtern. Die Funktion FarbeNachGeschlecht() ändert die Farbe einiger Unterformulare je nach dem aktuellen Geschlecht. Es ist aber eigentlich nur bei der zentralen Person, Mutter, Vater und Partner eindeutig möglich. Bei Kindern und Geschwistern können in einem Unterformular sowohl männliche als auch weibliche Personen auftreten.
Die Funktion RequeryAll() aktualisiert die Anzeige der Personen in allen Unterformularen und aktualisiert auch den Inhalt aller Comboboxe, in welchen Personen je nach dem Familienverhältnis zur zentralen Person ausgewählt werden können.
Function SelectPerson(person As Variant)
If Not IsNull(person) Then
DoCmd.ApplyFilter , "lPerson = " & person
FarbeNachGeschlecht
RequeryAll
End If
Die Funktion FarbeNachGeschlecht() ändert die Hintergrundfarbe einiger Unterformulare je nach dem Geschlecht der zentralen Person. Die Farbenwerte sind im globalen Modul "g" als Konstanten FARBE_MANN, FARBE_FRAU und FARBE_WEISS gespeichert. Die weiße Farbe ist für die Eingabe einer neuen Person bestimmt (bevor das Geschlecht angegeben wird).
Die Funktion hat noch eine weitere Aufgabe. Je nach dem Geschlecht der zentralen Person wird die Datensatzherkunft für die Listbox, in dem die Partner angezeigt werden, geändert.
Function FarbeNachGeschlecht(geschlecht%)
If geschlecht = MANN Then
farbe = FARBE_MANN
partnerfarbe = FARBE_FRAU
Forms!frmHaupt!subPartner.Form!lstPartner.
RowSource = "qryPartnerFrau"
ElseIf geschlecht = FRAU Then
farbe = FARBE_FRAU
partnerfarbe = FARBE_MANN
Forms!frmHaupt!subPartner.Form!lstPartner.
RowSource = "qryPartnerMann"
Else
farbe = FARBE_WEISS
partnerfarbe = FARBE_WEISS
End If
Forms!frmHaupt!subPerson.Form.
Detailbereich.BackColor = farbe
...
Nach dem Wechsel oder Löschen der zentralen Person oder einer Änderung der Familienbeziehungen muß die Anzeige in allen Unterformularen aktualisiert werden. Diese Aufgabe übernimmt die Funktion RequeryAll(). Sie besteht nur aus einer Reihe von Aufrufen der Methode Requery für alle betroffenen Steuerelemente.
Function RequeryAll()
Set frm = Forms!frmHaupt
frm!subKinder.Form!lstKinder.Requery
...
Für die Eingabe der Daten einer neuen Person wird der zentrale Teil des Hauptformulars verwendet. Alle restlichen Teile werden mit der Funktion RelatVisible() ausgeblendet. Für den Start der Eingabe und Speichern des neuen Datensatzes wird die gleiche Schlatfläche eingesetzt. Ihre Aufschrift wird von "Neue Person" auf "Speichern" temporär geändert.
In der Ereignisprozedur cmdNeuePerson_Click() wird die Aufschrift auf der Schaltfläche abgefragt und entweder die Eingabe gestartet oder der neue Datensatz gespeichert.
Nach dem Speichern einer neuen Person wird sie als zentrale Person angezeigt. Sollte die Eingabe unterbrochen werden, wird die Anzeige der vorherigen Person wiederhergestellt. Ihr Schlüssel wird in der statischen Variablen savperson nach dem Start der Eingabe abgelegt.
Sub cmdNeuePerson_Click()
Static savperson&
If Me!cmdNeuePerson.Caption = "Neue Person"
Then
If Not IsNull(Me!lPerson) Then
savperson = Me!lPerson
End If
FarbeNachGeschlecht (0)
Me!cmdNeuePerson.Caption = "Speichern"
RelatVisible (False)
...
DoCmd.RunCommand (acCmdDataEntry)
Else
If IsNull(Me!txtNachname) Or
(Me!grpGeschlecht = 0) Then
If MsgBox("Nachname und Geschlecht
müssen eingegeben werden",
vbRetryCancel) = vbRetry Then
Exit Sub
Else
sav = False
End If
Else
sav = True
End If
Me!cmdNeuePerson.Caption = "Neue Person"
RelatVisible (True)
...
If sav Then
DoCmd.RunCommand (acCmdSaveRecord)
savperson = DLast("lPerson",
"tblPerson")
End If
If Not IsNull(savperson) Then
SelectPerson (savperson)
End If
End If
Die Funktion RelatVisible() blendet die Unterformulare für Verwandte, Wohnnorte und Ereignisse und einige Steuerelemente des zentralen Unterformulars je nach dem Wert des Parameters visib ein oder aus. Sie wird ausschließlich bei der Eingabe einer neuen Person eingesetzt.
Function RelatVisible(visib%)
Set frm = Forms!frmHaupt
Set subpers = frm!subPerson.Form
frm!subMutter.Visible = visib
...
subpers!cboPerson.Visible = visib
...
Der einfachste Selektionsausdruck wird auf dem Unterformular fsubPerson in der Combobox cboPerson als die Eigenschaft Datensatzherkunft eingetragen. Er liefert die Felder, die bei der Auswahl einer Person angezeigt werden.
SELECT lPerson,sNachname, sVorname, sTitel, dtmGeburtstag
FROM tblPerson
ORDER BY sNachname, dtmGeburtstag
Die SQL-Ausdrücke in der Eigenschaft Datensatzherkunft der Combobox für die Auswahl der Mutter und des Vaters sind beide identisch bis auf das Geschlecht.
Es werden aber nur die Personen selektiert, die älter als die zentrale Person sind und zum Zeitpunkt ihrer Geburt nicht tot waren.
SELECT ... FROM tblPerson
WHERE (iGeschlecht=2)
AND (dtmGeburtstag<
Forms!frmHaupt!subPerson.Form!dtmGeburtstag) ...
AND (dtmSterbetag>=
Forms!frmHaupt!subPerson.Form!dtmGeburtstag)
...
Die Comboboxe cboMutter und cboVater sind direkt an die Felder lMutter, bzw. lVater gebunden. Nach der Auswahl der Person wird ihr Schlüssel direkt in den Datensatz der zentralen Person gespeichert. In der Ereignis-Prozedur NachAktualisierung wird die Funktion SelectPerson() aufgerufen. Damit werden die bei der Zuordnung schon verfügbaren Verwandten sofort angezeigt.
Die SQL-Ausdrücke für die Datenherkunft des Unterformulars subMutter entsprechen genau der o.g. Definition.
SELECT * FROM tblPerson
WHERE
(tblPerson.lPerson = Forms!frmHaupt!lMutter)
Der analogische SQL-Ausdruck für das Unterformular subVater lautet:
SELECT * FROM tblPerson
WHERE
(tblPerson.lPerson = Forms!frmHaupt!lVater)
Die Kinder werden im Unterformular fsubKinder, in der Listbox lstKinder angezeigt. Das nummerische Feld Geschlecht wird vor der Anzeige der Kinder oder Geschwister in ein "M" oder "F" umgewandelt und bekommt einen kurzen Namen "G". Die Eigenschaft Datensatzherkunft dieser Listbox enthält folgenden SQL-Ausdruck:
SELECT ..., iif(iGeschlecht=1,"M","F") AS G
FROM tblPerson
WHERE
tblPerson.lMutter=Forms!frmHaupt!lPerson
OR
tblPerson.lVater=Forms!frmHaupt!lPerson
ORDER BY dtmGeburtstag;
Die Selektion der Geschwister ist ähnlich wie bei den Kindern. Das Geschlecht wird wieder explizit angezeigt, weil es von dem Geschlecht der zentralen Person nicht eindeutig abgeleitet werden kann.
Die oben angeführte Definition der Geschwister muß noch etwas präzisiert werden.
· Aus der Übereinstimmung der Schlüsselwerte lMutter oder lVater muß der Wert 0 ausgeschlossen werden, sonst werden alle Personen ohne zugeordnete Eltern als Geschwister angezeigt.
· Die zentrale Person darf nicht gleichzeitig unter den Geschwistern erscheinen.
Zwischen den zwei Bedingungen für die gleiche Mutter oder den gleichen Vater steht der logische Operator OR, damit auch Halbgeschwister ausgewählt werden.
SELECT ..., iif(iGeschlecht=1,"M","F") AS G
FROM tblPerson
WHERE
(((tblPerson.lMutter=Forms!frmHaupt!lMutter) AND (tblPerson.lMutter>0))
OR
((tblPerson.lVater=Forms!frmHaupt!lVater)
AND (tblPerson.lVater>0)))
AND
(tblPerson.lPerson<>Forms!frmHaupt!lPerson)
ORDER BY dtmGeburtstag;
Mit der Schaltfläche Partner wird das Formular frmPartner geöffnet. Dieses Formular ist an die Tabelle tblPartner gebunden. Im oberen Teil sind zwei Comboboxe cboMann und cboFrau für die Auswahl des Mannes, bzw. der Frau.
Die SQL-Ausdrücke für beide dieser Comboboxe unterscheiden sich nur in der Auswahl des Geschlechts. Außerdem werden die Personen ausgeschlossen, die bei der Geburt der zentralen Person bereits tot waren. Die Datensatzherkunft z.B. für die Combobox cboMann lautet also:
SELECT ... FROM tblPerson
WHERE (iGeschlecht=1)
AND
((dtmSterbetag>=
Forms!frmHaupt!subPerson.Form!dtmGeburtstag) OR IsNull(tblPerson.dtmSterbetag)
OR IsNull
(Forms!frmHaupt!subPerson.Form!dtmGeburtstag))
ORDER BY sNachname, dtmGeburtstag
Beim Laden des Formulars wird je nach dem Geschlecht der zentralen Person nur eine dieser Comboboxe angezeigt. Außerdem werden nur die Datensätze der Partnerschafttabelle ausgefiltert, die im Feld lMann, bzw. lFrau den Schlüssel der zentralen Person enthalten.
Sub Form_Load()
If Forms!frmHaupt!iGeschlecht = 1 Then
Me!cboMann.Visible = False
Me!cboFrau.Visible = True
DoCmd.ApplyFilter ,
"lMann = Forms!frmhaupt!lPerson"
Else
Me!cboMann.Visible = True
Me!cboFrau.Visible = False
DoCmd.ApplyFilter ,
"lFrau = Forms!frmhaupt!lPerson"
End If
Die Comboboxe sind an die Felder lMann, bzw. lFrau gebunden, dadurch wird nach der Auswahl der Personenschlüssel der ausgewählten Person in die Partnerschaftstabelle gespeichert.
Die Listbox lstPartner auf dem Unterformular fsubPartner wird in der Funktion FarbeNachGeschlecht() je nach dem Geschlecht an die Abfrage qryPartnerMann oder qryPartnerFrau gebunden.
Die o.g. Abfragen müssen auf zwei Tabellen zugreifen. Es werden die Personen aufgelistet, derer Schlüssel in der Tabelle tblPartner gemeinsam mit dem Schlüssel der zentralen Person steht.
Der SQL-Ausdruck der Abfrage qryPartnerMann liefert die Personendaten aus der Tabelle tblPerson und aus der Tabelle tblPartner dazu noch das Datum der Eheschließung.
SELECT tblPerson. ..., tblPartner.dtmVon
FROM tblPartner
INNER JOIN tblPerson
ON tblPartner.lMann = tblPerson.lPerson
WHERE
(((tblPartner.lFrau)=
[Forms]![frmHaupt]![lPerson]))
ORDER BY tblPerson.dtmGeburtstag;
In der Abfrage qryPartnerFrau werden nur die Felder lMann und lFrau der Partnerschaftstabelle ausgewechselt.
SELECT tblPerson. ..., tblPartner.dtmVon
FROM tblPartner
INNER JOIN tblPerson
ON tblPartner.lFrau = tblPerson.lPerson
WHERE
(((tblPartner.lMann)=
[Forms]![frmHaupt]![lPerson]))
ORDER BY tblPerson.dtmGeburtstag;
Die Zuordnung der Wohnorte ist prinzipiell gleich wie die Zuordnung von Partnern. Sie ist einfacher, weil lediglich die zentrale Person im Spiel ist und der Vorgang vom Geschlecht unabhängig ist.
Mit der Schaltfläche Wohnorte wird das Formular frmWohnort geöffnet. Beim Laden werden die Datensätze, die den Schlüssel der zentralen Person enthalten, ausgefiltert.
Private Sub Form_Load()
DoCmd.ApplyFilter ,
"lPerson = Forms!frmhaupt!lPerson"
Die Adressen, die zugeordnet werden sollen, müssen zuerst in der Tabelle tblAdresse gespeichert sein. Mit der Schalfläche Adressen öffnen Sie das Formular frmAdresse und dort können Sie sie eintragen. Die bereits gespeicherten Adressen können dann auf dem Formular frmWohnort mit der Combobox cboAdresse der zentralen Person zugeordnet werden. Dabei wird der Adressenschlüssel lAdresse in die Tabelle tblWohnort gespeichert. In zwei Textfeldern unter der Combobox können Sie die Gültigkeit des jeweiligen Wohnortes einschränken.
Alle der zentralen Person zugeordneten Wohnorte werden auf dem Unterformular fsubWohnort in der Listbox lstWohnort aufgelistet. Die Listbox ist an die Abfrage qryWohnort gebunden.
Der SQL-Ausdruck der Abfrage qryWohnort liefert alle Datensätze aus der Tabelle tblWohnort, die den Schlüssel der zentralen Person enthalten und alle zugeordneten Adressangaben aus der Tabelle tblAdresse.
SELECT tblWohnort. ...,
tblAdresse. ...
FROM tblAdresse INNER JOIN tblWohnort
ON tblAdresse.lAdresse = tblWohnort.lAdresse
WHERE
(((tblWohnort.lPerson)=
[forms]![frmHaupt]![lPerson]))
ORDER BY tblWohnort.dtmVon DESC;
Mit der Schaltfläche Ereignisse wird das Formular frmEreignis geöffnet. Beim Laden werden genauso wie bei Wohnorten die Datensätze, die den Schlüssel der zentralen Person enthalten, ausgefiltert.
Der SQL-Ausdruck für die Selektion der Ereignisse, welche in der Listbox lstEreignis auf dem Unterformular fsubEreignis angezeigt werden sollen, ist direkt in der Eigenschaft Datensatzherkunft eingetragen.
SELECT lPerson, sEreignis,dtmVon, dtmBis
FROM tblEreignis
WHERE lPerson=Forms!frmHaupt!lPerson
ORDER BY dtmVon
Das Programm ist ein Beispiel dafür, dass eine gut durchdachte Datenmodellierung auch bei einer relativ komplexen Aufgabe zu einer einfachen und übersichtlichen Lösung führen kann.