Объект relation (DAO)
Область применения: Access 2013, Office 2013
Объект Relation представляет связь между полями в таблицах или запросах (только базы данных ядра СУБД Microsoft Access).
Замечания
Объект Relation можно использовать для создания новых связей и проверки существующих связей в базе данных.
С помощью объекта Relation и его свойств можно:
Укажите принудительное отношение между полями в базовых таблицах (но не связь, которая включает запрос или связанную таблицу).
Установите незавязанные связи между таблицами или запросами любого типа — собственными или связанными.
Используйте свойство Name для ссылки на связь между полями в основной таблице, на который ссылается ссылка, и ссылающейся внешней таблицей.
Используйте свойство Attributes , чтобы определить, является ли связь между полями в таблице "один к одному" или "один ко многим" и как обеспечить целостность ссылок.
Используйте свойство Attributes , чтобы определить, может ли ядро СУБД Microsoft Access выполнять каскадные операции обновления и каскадного удаления для первичных и внешних таблиц.
Используйте свойство Attributes , чтобы определить, является ли связь между полями в таблице соединением слева или соединением по правому краю.
Используйте свойство Name всех объектов Field в коллекции Fields объекта Relation , чтобы задать или вернуть имена полей в первичном ключе таблицы, на которые ссылается ссылка, или параметры свойств ForeignName объектов Field , чтобы задать или вернуть имена полей во внешнем ключе ссылающейся таблицы.
При внесении изменений, нарушающих связи, установленные для базы данных, возникает перехватываемая ошибка. При запросе каскадных операций обновления или каскадного удаления ядро СУБД Microsoft Access также изменяет таблицы первичного ключа или внешнего ключа для принудительного применения связей, которые вы устанавливаете.
Например, база данных Northwind содержит связь между таблицей Orders и таблицей Customers. Поле CustomerID таблицы Customers является первичным ключом, а поле CustomerID таблицы Orders — внешним ключом. Чтобы ядро СУБД Microsoft Access приняло новую запись в таблице Orders, оно выполняет поиск совпадения в таблице Customers в поле CustomerID таблицы Orders. Если ядро СУБД Microsoft Access не находит совпадение, оно не принимает новую запись и возникает перехватываемая ошибка.
При принудительном применении ссылочной целостности для ключевого поля таблицы, на который указывает ссылка, уже должен существовать уникальный индекс. Ядро СУБД Microsoft Access автоматически создает индекс со свойством Foreign , заданным для использования в качестве внешнего ключа в таблице ссылок.
Чтобы создать объект Relation , используйте метод CreateRelation . Чтобы ссылаться на объект Relation в коллекции по порядковому номеру или параметру свойства Name , используйте любую из следующих форм синтаксиса:
Отношения(0)
Relations("name")
Отношения! [имя]
Пример
В этом примере показано, как существующий объект Relation может управлять вводом данных. Процедура пытается добавить запись с заведомо неправильным CategoryID; при этом запускается подпрограмма обработки ошибок.
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
В этом примере метод CreateRelation используется для создания отношения между элементом Employees TableDef и новым tableDef с именем Departments. В нем также показано, как при создании нового отношения также создаются все необходимые индексы во внешней таблице (индекс DepartmentsEmployees в таблице 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