2010-05-28 16 views
0

prennent donc l'exemple suivant:VBA ACCESS - ne peut pas créer des relations

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 

Je continue à obtenir l'erreur:

No unique index found for the referenced field of the primary table.

Si j'inclure l'ABV avant que cette sous pour créer dans l'index sur le terrain , il me donne l'erreur:

Index already exists.

Alors j'essaye de comprendre ceci. Si aucune clé primaire n'est définie, cela ne fonctionnera-t-il pas? Je suis confus par cela, mais je veux vraiment vraiment comprendre cela. Alors orderID est une clé étrangère dans le Products Tableau

Répondre

1

Vous pouvez créer une relation manuellement via l'interface, puis l'inverser. Voici une session immédiate fenêtre où j'ai examiné une relation existante:

? 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 

Pour référence, c'est le sous utilisé pour créer cette relation:

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 

Ne vous embêtez pas avec l'attribut dbRelationUpdateCascade jusqu'après vous confirmez que vous avez trié quelles sont la table et la clé étrangères.

+0

merci comme toujours Hans! – Justin

+0

L'utilisation de DDL au lieu de DAO n'est généralement pas plus facile. –

2

L'erreur « Aucun index unique trouvé pour le champ référencé de la table primaire » est causée par le fait que OrderId ne doit pas être la clé primaire de la table des commandes et il doit pas d'indice unique sur celui-ci.

Les autres erreurs "Index existe déjà" sont causées par le fait qu'Access va ajouter un index non unique à une clé étrangère lors de sa création. Il est probable qu'il existe déjà un index dans la table Produits appelé "OrderId" et qu'il crée une collision lorsque vous essayez de créer la clé étrangère via le code. Vous devez vérifier la collection TableDef.Indexes sur la table Produits pour vous assurer qu'un index appelé "OrderId" n'existe pas déjà avant d'ajouter la clé étrangère.

+0

merci beaucoup pour l'aide! – Justin

Questions connexes