Tabellen - Beziehungen erstellen
Wie kann ich eine Beziehung erstellen?
Grundsätzlich besteht programmiertechnisch gesehen keine großen Unterschiede zwischen dem Anlegen von Relationen und dem Anlegen von Indizes oder Tabellen. Sie vereinbaren eine Objektvariable für ein Objekt von Type Relation (DAO) bzw. Key (ADOX) oder Verwenden die CONSTRAINT (DDL) Anweisung, charakterisieren es, fügen ein oder mehrere Feld Objekte in dessen Auflistung ein und fügen das Ganze dann in die Relationen Auflistung des Datenbankobjekts ein. Die Charakterisierung legt die Art der Beziehung fest, zum Beispiel ob sie kaskadierte Aktualisierungen und Löschoperationen impliziert.
DAO-Variante
Beispiel:
Public Function DAO_CreateRelation(pdbs As DAO.Database, _ psPTable As String, _ psFTable As String, _ psPField As String, _ psFField As String, _ psRelName As String, _ Optional plRelType _ As DAO.RelationAttributeEnum = 0) _ As Boolean '// ===================================================== '// Methode | Erstellt eine Beziehung under DAO '// ----------------------------------------------------- '// Parameter | pdbs - Datenbankobjekt ' psPTable - Primärtabelle (1-Seite) ' psFTable - Sekundärtabelle (n-Seite) ' psPField - Primärfeld ' psFField - Sekundärfeld ' psRelName - Eindeutige Bezeichnung ' plRelType - Relationen-Eigenschaften z.B. '// ----------------------------------------------------- ' Löschweitergabe - dbRelationDeleteCascade ' Aktualisierungsweitergabe - dbRelationUpdateCascade ' 1-1-Beziehung - dbRelationUnique ' man kann es auch kombiniert z.B. ' dbRelationUnique + dbRelationDeleteCascade ect. '// ----------------------------------------------------- '// Rückgabe | Boolean - Erfolgreich True, sonst False '// ----------------------------------------------------- '// Erstellt | Manuela Kulpa - Nov 09, 2003 '// | EDV Innovation & Consulting - Dormagen '// ===================================================== On Error GoTo HandleErr Dim rel As DAO.Relation Dim fld As DAO.Field ' Erstellen der Beziehung Set rel = pdbs.CreateRelation() With rel ' Eindeutige Bezeichnung der Relation rel.Name = psRelName ' Angabe Primärtabelle (1-Seite) rel.Table = psPTable ' Angabe Sekundärtabelle (n-Seite) rel.ForeignTable = psFTable End With ' Angabe des Feldes der Primärseite (1-Seite) Set fld = rel.CreateField(psPField) ' Einstellen der ForeignName-Eigenschaft des ' Feldes auf den Namen des entsprechenden Feldes ' in der Primärtabelle, hier die Sekundärseite fld.ForeignName = psFField If plRelType > 0 Then rel.Attributes = rel.Attributes Or plRelType End If rel.Fields.Append fld ' Anhängen der Beziehung zur Auflistung pdbs.Relations.Append rel DAO_CreateRelation = True HandleExit: If Not fld Is Nothing Then Set fld = Nothing If Not rel Is Nothing Then Set rel = Nothing Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap04.DAO_CreateRelation" End Select DAO_CreateRelation = False Resume HandleExit End Function
ADOX-Variante
Beispiel:
Public Function ADO_CreateRelation(pcnn As ADODB.Connection, _ psPTable As String, _ psFTable As String, _ psPField As String, _ psFField As String, _ psRelName As String, _ Optional pfBUpdateRule As Boolean, _ Optional pfBUpDeleteRule As Boolean) _ As Boolean '// ===================================================== '// Methode | Erstellt eine Beziehung und ADOX '// ----------------------------------------------------- '// Parameter | pcnn - Connection ' psPTable - Primärtabelle ' psFTable - Sekundärtabelle ' psPField - Primärfeld ' psFField - Sekundärfeld ' psRelName - Eindeutige Bezeichnung ' pfBUpdateRule - Löschweitergabe ' pfBUpDeleteRule - Aktualisierungsweiterg. '// ----------------------------------------------------- '// Rückgabe | Boolean - '// ----------------------------------------------------- '// Erstellt | Manuela Kulpa - Nov 09, 2003 '// | EDV Innovation & Consulting - Dormagen '// ===================================================== On Error GoTo HandleErr Dim cat As New ADOX.Catalog Dim tbl As ADOX.Table Dim rel As New ADOX.key ' Öffnen des Katalogs cat.ActiveConnection = pcnn ' Angabe Sekundärtabelle (n-Seite) Set tbl = cat.Tables(psFTable) With rel ' Eindeutige Bezeichnung der Relation .Name = psRelName ' Angabe des Beziehungstypes ' auch wenn eine 1-1-Beziehung vorliegt, ' ist unter ADOX keine Möglichkeit gegeben, ' dies explizit anzugeben, Jet erkennt es ' aber, es wird im Beziehungsfenster ' aber nicht korrekt dargestellt .Type = adKeyForeign ' Angabe Primärtabelle (1-Seite) .RelatedTable = psPTable ' Angabe des Sekundärfeldes (n-Seite) .Columns.Append psFField ' Einstellen der RelatedColumn-Eigenschaft ' auf den Namen der entsprechenden Spalte ' in der Primärtabelle .Columns(psFField).RelatedColumn = psPField If pfBUpdateRule Then .UpdateRule = adRICascade End If If pfBUpdateRule Then .DeleteRule = adRICascade End If End With ' Anhängen der Beziehung zur Auflistung tbl.Keys.Append rel ADO_CreateRelation = True HandleExit: If Not rel Is Nothing Then Set rel = Nothing If Not tbl Is Nothing Then Set tbl = Nothing If Not cat Is Nothing Then Set cat = Nothing Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap04.ADO_CreateRelation" End Select ADO_CreateRelation = False Resume HandleExit End Function
SQL-DDL-Variante
Beispiel:
' DAO-Variante Public Function DDL_CreateRelationDao(pdbs As DAO.Database, _ psPTable As String, _ psFTable As String, _ psPField As String, _ psFField As String, _ psRelName As String) _ As Boolean On Error GoTo HandleErr Dim sSQL As String sSQL = "ALTER TABLE " & psFTable sSQL = sSQL & " ADD CONSTRAINT " & psRelName sSQL = sSQL & " FOREIGN KEY ([" & psFField sSQL = sSQL & "]) REFERENCES " & psPTable sSQL = sSQL & " ([" & psPField & "])" pdbs.Execute sSQL, dbFailOnError DDL_CreateRelationDao = True HandleExit: Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap04.DDL_CreateRelationDao" End Select DDL_CreateRelationDao = False Resume HandleExit End Function ' ADO-Variante Public Function DDL_CreateRelationADO(pcnn As ADODB.Connection, _ psPTable As String, _ psFTable As String, _ psPField As String, _ psFField As String, _ psRelName As String, _ Optional pfBUpdateRule As Boolean, _ Optional pfBUpDeleteRule As Boolean) _ As Boolean On Error GoTo HandleErr Dim sSQL As String sSQL = "ALTER TABLE " & psFTable sSQL = sSQL & " ADD CONSTRAINT " & psRelName sSQL = sSQL & " FOREIGN KEY ([" & psFField sSQL = sSQL & "]) REFERENCES " & psPTable sSQL = sSQL & " ([" & psPField & "])" ' Nur unter ADO möglich If pfBUpdateRule Then sSQL = sSQL & " ON UPDATE CASCADE" End If If pfBUpDeleteRule Then sSQL = sSQL & " ON DELETE CASCADE" End If pcnn.Execute sSQL, dbFailOnError DDL_CreateRelationADO = True HandleExit: Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap04.DDL_CreateRelationADO" End Select DDL_CreateRelationADO = False Resume HandleExit End Function