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