ДОСТУП VBA - не может создавать отношения - PullRequest
0 голосов
/ 29 мая 2010

Итак, возьмите следующий пример:

Sub CreateRelation()

   Dim db As Database
   Dim rel As Relation
   Dim fld As Field

   Set db = CurrentDb
   Set rel = db.CreateRelation("OrderID", "Orders", "Products")

   'referential integrity
   rel.Attributes = dbRelationUpdateCascade

   'specify the key in the referenced table
   Set fld = rel.CreateField("OrderID")

   fld.ForeignName = "OrderID"

   rel.Fields.Append fld

   db.Relations.Append rel

End Sub

Я получаю сообщение об ошибке:

Не найдено уникального индекса для указанного поля первичной таблицы.

Если я добавляю vba перед этим подпрограммой для создания индекса в поле, он выдаст мне ошибку:

Индекс уже существует.

Так что я пытаюсь понять это. Если первичные ключи не заданы, будет ли это работать? Я смущен этим, но я действительно очень хочу понять это. Таким образом, orderID - ИНОСТРАННЫЙ КЛЮЧ в таблице Products

Ответы [ 2 ]

2 голосов
/ 29 мая 2010

Ошибка «Не найдено уникального индекса для указанного поля первичной таблицы» вызвана тем, что OrderId не должен быть первичным ключом таблицы Orders и не должен иметь уникальный индекс.

Другие ошибки «Индекс уже существует» вызваны тем, что Access добавит неуникальный индекс к внешнему ключу при его создании. Вполне вероятно, что в таблице «Продукты» уже есть индекс под названием «OrderId», и он создает коллизию, когда вы пытаетесь создать внешний ключ с помощью кода. Необходимо проверить коллекцию TableDef.Indexes в таблице «Продукты», чтобы убедиться, что индекс с именем «OrderId» еще не существует, прежде чем добавлять внешний ключ.

1 голос
/ 29 мая 2010

Вы можете создать отношения вручную через интерфейс, а затем выполнить обратный инжиниринг. Вот сеанс Immediate Window, в котором я исследовал существующие отношения:

? currentdb.Relations.Count
 1 

? currentdb.Relations(0).Name
parentchild

? currentdb.Relations(0).Table
tblParent

? currentdb.Relations(0).ForeignTable
tblChild

? currentdb.Relations(0).Fields.Count
 1 

? currentdb.Relations(0).Fields(0).Name
id

? currentdb.Relations(0).Fields(0).ForeignName
parent_id

Для справки: это подпункт, используемый для создания этих отношений:

Public Sub CreateRelationship()
Dim strSql As String
strSql = "ALTER TABLE tblChild" & vbNewLine & _
    "ADD CONSTRAINT parentchild" & vbNewLine & _
    "FOREIGN KEY (parent_id) REFERENCES tblParent (id);"
CurrentProject.Connection.Execute strSql
End Sub

Не связывайтесь с атрибутом dbRelationUpdateCascade до тех пор, пока не подтвердите, что вы выяснили, какая из сторонней таблицы и ключа.

...