vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Re: Danke 
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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Dieter, hab wieder mal...54Michael24.09.01 10:54
BITTE, HILFE29Michael24.09.01 14:16
Re: Dieter, hab wieder mal...278unbekannt24.09.01 18:48
Da kann ich nur zustimmen32BKC24.09.01 22:25
Danke28Michael25.09.01 07:52
Re: Danke292unbekannt25.09.01 18:47
Unter Re - Danke stehen die Relationen!!!! (oT)282unbekannt25.09.01 18:48

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel