Partager via


Objet Relation (DAO)

S’applique à : Access 2013, Office 2013

Un objet Relation représente une relation entre des champs de tables ou de requêtes (bases de données de moteur de base de données Microsoft Access uniquement).

Remarques

Vous pouvez utiliser l'objet Relation pour créer des relations et examiner les relations existantes dans la base de données.

Grâce à un objet Relation et à ses propriétés, vous pouvez :

  • Indiquer une relation appliquée entre des champs de tables de base (mais pas une relation impliquant une requête ou une table liée).

  • Définir des relations non appliquées entre tout type de table ou de requête (natif ou lié).

  • Utiliser la propriété Name pour faire référence à la relation entre les champs dans la table primaire référencée et la table étrangère de référence.

  • Utiliser la propriété Attributes pour déterminer le type de relation entre les champs de la table (un-à-un ou un-à-plusieurs), ainsi que le mode d'application de l'intégrité référentielle.

  • Utiliser la propriété Attributes pour déterminer si le moteur de base de données Microsoft Access peut effectuer des opérations de mise à jour en cascade et de suppression en cascade dans des tables primaires et étrangères.

  • Utiliser la propriété Attributes pour déterminer si la relation entre les champs de la table est du type jointure gauche ou jointure droite.

  • Utiliser la propriété Name de tous les objets Field dans la collection Fields d'un objet Relation pour définir ou renvoyer les noms des champs dans la clé primaire de la table référencée ou les paramètres de propriété ForeignName des objets Field pour définir ou renvoyer les noms des champs dans la clé étrangère de la table de référence.

Si vous apportez des modifications contraires aux relations définies pour la base de données, une erreur interceptable se produit. Si vous demandez des opérations de mise à jour en cascade ou de suppression en cascade, le moteur de base de données Microsoft Access modifie également les tables de clé primaire ou de clé étrangère afin d'appliquer les relations définies.

Par exemple, la base de données Northwind contient une relation entre la table Orders et la table Customers. Le champ CustomerID de la table Customers représente la clé primaire et le champ CustomerID de la table Orders constitue la clé étrangère. Pour accepter un nouvel enregistrement dans la table Orders, le moteur de base de données Microsoft Access recherche dans la table Customers une correspondance pour le champ CustomerID de la table Orders. S'il ne trouve aucune correspondance, il refuse le nouvel enregistrement et une erreur interceptable se produit.

Lors de l'application de l'intégrité référentielle, un index unique doit déjà exister pour le champ clé de la table référencée. Le moteur de base de données Microsoft Access crée automatiquement un index en définissant la propriété Foreign pour qu'elle fasse office de clé étrangère dans la table de référence.

Pour créer un objet Relation, utilisez la méthode CreateRelation. Pour faire référence à un objet Relation dans une collection par son numéro ordinal ou par son paramètre de propriété Name, utilisez l'une des formes de syntaxe suivantes :

Relations(0)

Relations(« name »)

Des relations ! [name]

Exemple

L'exemple ci-dessous indique comment un objet Relation existant peut déterminer l'entrée de données. La procédure tente d'ajouter un enregistrement dont le champ CategoryID est délibérément incorrect, ce qui déclenche la routine de traitement des erreurs.

    Sub RelationX() 
     
     Dim dbsNorthwind As Database 
     Dim rstProducts As Recordset 
     Dim prpLoop As Property 
     Dim fldLoop As Field 
     Dim errLoop As Error 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     Set rstProducts = dbsNorthwind.OpenRecordset("Products") 
     
     ' Print a report showing all the different parts of 
     ' the relation and where each part is stored. 
     With dbsNorthwind.Relations!CategoriesProducts 
     Debug.Print "Properties of " & .Name & " Relation" 
     Debug.Print " Table = " & .Table 
     Debug.Print " ForeignTable = " & .ForeignTable 
     Debug.Print "Fields of " & .Name & " Relation" 
     With .Fields!CategoryID 
     Debug.Print " " & .Name 
     Debug.Print " Name = " & .Name 
     Debug.Print " ForeignName = " & .ForeignName 
     End With 
     End With 
     
     ' Attempt to add a record that violates the relation. 
     With rstProducts 
     .AddNew 
     !ProductName = "Trygve's Lutefisk" 
     !CategoryID = 10 
     On Error GoTo Err_Relation 
     .Update 
     On Error GoTo 0 
     .Close 
     End With 
     
     dbsNorthwind.Close 
     
     Exit Sub 
     
    Err_Relation: 
     
     ' Notify user of any errors that result from 
     ' the invalid data. 
     If DBEngine.Errors.Count > 0 Then 
     For Each errLoop In DBEngine.Errors 
     MsgBox "Error number: " & errLoop.Number & _ 
     vbCr & errLoop.Description 
     Next errLoop 
     End If 
     
     Resume Next 
     
    End Sub 

Cet exemple utilise la méthode CreateRelation pour créer une Relation entre l'objet TableDef Employees et un nouvel objet TableDef appelé Departments. Il montre également comment la création d’une relation crée également tous les index nécessaires dans la table étrangère (l’index DepartmentsEmployees dans la table Employees).

    Sub CreateRelationX() 
     
     Dim dbsNorthwind As Database 
     Dim tdfEmployees As TableDef 
     Dim tdfNew As TableDef 
     Dim idxNew As Index 
     Dim relNew As Relation 
     Dim idxLoop As Index 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     
     With dbsNorthwind 
     ' Add new field to Employees table. 
     Set tdfEmployees = .TableDefs!Employees 
     tdfEmployees.Fields.Append _ 
     tdfEmployees.CreateField("DeptID", dbInteger, 2) 
     
     ' Create new Departments table. 
     Set tdfNew = .CreateTableDef("Departments") 
     
     With tdfNew 
     ' Create and append Field objects to Fields 
     ' collection of the new TableDef object. 
     .Fields.Append .CreateField("DeptID", dbInteger, 2) 
     .Fields.Append .CreateField("DeptName", dbText, 20) 
     
     ' Create Index object for Departments table. 
     Set idxNew = .CreateIndex("DeptIDIndex") 
     ' Create and append Field object to Fields 
     ' collection of the new Index object. 
     idxNew.Fields.Append idxNew.CreateField("DeptID") 
     ' The index in the primary table must be Unique in 
     ' order to be part of a Relation. 
     idxNew.Unique = True 
     .Indexes.Append idxNew 
     End With 
     
     .TableDefs.Append tdfNew 
     
     ' Create EmployeesDepartments Relation object, using 
     ' the names of the two tables in the relation. 
     Set relNew = .CreateRelation("EmployeesDepartments", _ 
     tdfNew.Name, tdfEmployees.Name, _ 
     dbRelationUpdateCascade) 
     
     ' Create Field object for the Fields collection of the 
     ' new Relation object. Set the Name and ForeignName 
     ' properties based on the fields to be used for the 
     ' relation. 
     relNew.Fields.Append relNew.CreateField("DeptID") 
     relNew.Fields!DeptID.ForeignName = "DeptID" 
     .Relations.Append relNew 
     
     ' Print report. 
     Debug.Print "Properties of " & relNew.Name & _ 
     " Relation" 
     Debug.Print " Table = " & relNew.Table 
     Debug.Print " ForeignTable = " & _ 
     relNew.ForeignTable 
     Debug.Print "Fields of " & relNew.Name & " Relation" 
     
     With relNew.Fields!DeptID 
     Debug.Print " " & .Name 
     Debug.Print " Name = " & .Name 
     Debug.Print " ForeignName = " & .ForeignName 
     End With 
     
     Debug.Print "Indexes in " & tdfEmployees.Name & _ 
     " TableDef" 
     For Each idxLoop In tdfEmployees.Indexes 
     Debug.Print " " & idxLoop.Name & _ 
     ", Foreign = " & idxLoop.Foreign 
     Next idxLoop 
     
     ' Delete new objects because this is a demonstration. 
     .Relations.Delete relNew.Name 
     .TableDefs.Delete tdfNew.Name 
     tdfEmployees.Fields.Delete "DeptID" 
     .Close 
     End With 
     
    End Sub