| |
![zurück](../images/b_zurueck.gif)
Fortgeschrittene ProgrammierungRe: Danke | | ![](../images/trans.gif) | Autor: unbekannt | Datum: 25.09.01 18:47 |
| Hi Michael,
ich denke mal, dass man das "Mehrtabellenproblem" doch kurz anreißen könnte - mal ohne Workshop.
Wie erreicht man, dass wenn ein Datensatz gelöscht wird, auch die Datensätze in anderen Tabellen, die mit dem gelöschten Datensatz im Zusammhang stehen, gelöscht werden? Wir erreicht man, dass wenn man eine Kundin hat, die heiratet einen anderen Namen animmt, dass der Kundennamen in jeder Tabelle geändert wird, wo diese Kundin eben auftaucht?
Mit RELATIONEN!
In der Regel finden wir in nahezu jeder Datenbank, die mehrere Tabellen verwaltet eine Tabelle vor, die Aufzählt, was wir im einzelnen Verwalten - einen Kunden, einen Schüler, ein ganz bestimmtes Fahrzeug o.v.a.m, es handelt sich dabei um die Basistabelle oder auch Primarytable. I.d.R. wird darin eine Kundennummer, oder was auch immer - oder der Namen als Primary-Key definiert um damit zu gewährleisten, dass der Gegenstand, Person oder was auch immer nur einmal in der Tabelle vertreten sein kann. Wir erreichen dadurch aber auch ein einen ziemlichen Performance-Gewinn, wenn wir einen Index setzen - soll man nicht vergessen. Alle anderen Tabellen enthalten zumeist ein oder mehrere Datenfelder, die sich auf den ganz bestimmten Datensatz der Primarytable beziehen, damit diese Daten in den anderen Tabellen ja wieder zur Person, Gegenstand oder was auch immer wieder zugeordnet werden kann - hier handelt es sich um sogenannte Detailtabellen. Typisches Beispiel der Kunde, mit Anschrift und allem in der Kundentabelle als Primarytable und dessen Fahrzeug z.B. als Deteiltabelle Fahrzeug (weil ein Kunde ja mehrere Fahrzeuge haben kann).
Z.B. der Kunde CyberLord hat zwei "Benziner". Ein 2 CV und einen Rasenmäher ich meinte natürlich einen John Deere Traktor. Kunde CyberLord gibt in der Tabelle Kunden ein Datensatz, in der Tabelle Fahrzeuge aber zwei Datensätze. Löscht man nun den Kunden CyberLord, muß auch in der Tabelle Fahrzeuge die Fahrzeuge gelöscht werden, die mit dem Kunden CyberLord in Verbindung standen (Referenziert waren) - um die referentielle Integrität der Datenbank zu wahren. Oder man stelle sich vor, CyberLord wird in den noch ärmeren Landadel erhoben und wird gar gekrönt: CyberKing (*schüttel*) - alle Tables umschreiben - nein.
Stellen wir uns also vor, wir hätten eine Kundentabelle und einen Index auf Kundennummer, wir hätten Deteiltabellen, die mittels dem Datenfeld Kundennummer mit der Tabelle Kundentabelle in einer Referenz stehen, z.B. Fahrzeuge und Rechnung.
PrimaryTable:
- Kundennummer (primary key - Autoincrement Var)
- Name
- Vorname
-- > Tables:
Fahrzeuge:
- Kundennummer (!)
- Marke
- Typ
- Kennzeichen (Index)
Rechnung
- Kundennummer(!!)
- Rechnungsnummer (Index, Autoincrement Var)
- Datum
- Betrag Soweit, jetzt setzen wir diese drei Tabellen in eine 1:N Relation. Alle drei Tabellen sind durch Kundennummer miteinander referenziert - bzw. anhand dieser Nummer werden Datensätze klar identifiziert und können einem Kunden zugeordnet werden (CyberKing ;-: )
Dim DB AS Database
Dim Fld AS Field
Dim mRel AS Relation
Private Sub SetMyRelations(Byval DBName As String)
'Öffnen der bestehenden Datenbank im exklusiv Modus
Set DB=DBEngine.OpenDatabase(DBName, True, False)
'Relation zwischen Kundentabelle und Tabelle Fahrzeuge erstellen
'1: N - referentielle Integrität
Set mRel = DB.CreateRelation("RelA")
With mRel
'Primarytable einstellen
.Table = "Kundentabelle"
'Referenzierte Tabelle einstellen
.ForeignTable = "Fahrzeuge"
'Verknüpfung als 1:N Beziehung deklarieren
.Attributes = dbRelationUpdateCascade & dbRelationDeleteCascade
'Gemeinsames Datenfeld creieren
Set Fld = .CreateField("Kundennummer")
Fld.ForeignName = "Kundennummer"
.Fields.Append Fld
End With
DB.Relations.Append mRel
'Das gleiche mit der Tabelle Rechnung
With mRel
'Primarytable einstellen
.Table = "Kundentabelle"
'Referenzierte Tabelle einstellen
.ForeignTable = "Rechnung"
'Verknüpfung als 1:N Beziehung deklarieren
.Attributes = dbRelationUpdateCascade & dbRelationDeleteCascade
'Gemeinsames Datenfeld creieren
Set Fld = .CreateField("Kundennummer")
Fld.ForeignName = "Kundennummer"
.Fields.Append Fld
End With
DB.Relations.Append mRel
DB.Close
End Sub Und schon gehorchen die Tabellen, wenn man CyberLord aus der Kundentabelle löscht, alle zu Cyberlord gehörenden Datensätze werden automatisch auch aus den anderen Tabellen gelöscht - Voila!
cu
Lordchen | ![](../images/trans.gif) |
![](../images/48x48/info.gif) | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
![nach oben](../images/b_top.gif) ![zurück](../images/b_zurueck.gif) |
|
sevISDN 1.0 ![sevISDN f?r VB/VBA und VB.NET](../images/werbung/sevisdn_100x116.gif)
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1 ![Flexibles DataGrid- und ListView-Control](../images/werbung/sevdatagrid3_100x100.jpg)
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|