Clé primaire double pour une relation de plusieur à plusieur

Résolu
bmikl59 Messages postés 77 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 14 février 2008 - 15 déc. 2005 à 15:03
bmikl59 Messages postés 77 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 14 février 2008 - 15 déc. 2005 à 16:38
J'ai une petite base de données à créer.
Celle ci contient 3 table :
Produit(num_prod)
Fonction(cde_fct, lib_fct)
droit(num_prod, cde_fct, datdeb, datfin)

La table droit est une table contient une cle primaire double (num_prod, cde_fct) qui me permet de savoir quelle fonction sont ouvertes pour 1 produit.

J'utilise les objet DAO pour créer cette bdd.
Pour les tables produit et fonction, il n'y a qu'une clé primaire, ça ne me pose pas de probleme.

Mais je n'arrive pas à creer les cles primaire et etrangere de la table droit :
cle primaire (num_prod, cde_fct)
cle etrangere 1 (num_prod) lié à num_prod de la table produit
cle etrangere 2 (cde_fct) lié à cde_fct de la table fonction

Dans l'index de la table droit, j'ajoute les champs num_prod et cde_fct et je met cette index en unique.

Mais lorsque j'ajoute des enrg dans la table, il me dit que je ne peux pas mattre 2 fois un num_prod (pb des doublons). Or cette table doit pouvoir contenir autant de numprod qu'il y a de fct pour ce produit.

Merci pour votre aide......

6 réponses

aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
15 déc. 2005 à 16:33
non, le probleme ne vient pas de la.

tu peux créer une table sans clef primaire, mais en l'occurence, il faut bein que tu te base sur ces deux champs pour faire ta relation.

je ne connais pas la méthode que tu as utilisée, mais je me demande si poru la table droit, tu n'as pas créé une clef pour num_prod et une autre pour cde_fct

en fait il faut que tu crée une et une seule clef primaire sur les deux champs en meme temps. du coup tu pourra un inserer plusieurs fois le meme ID de produit ou le meme ID de fonction, mais pas deux fois le meme couple (id de fonction + id de produit)

il me semble que c'est ce que tu veux.

d'autre part, j'ai l'impression que tu mélange index, clef primaire, et clef etrangere.
3
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
15 déc. 2005 à 15:19
salut

comment as tu créé tes clef ?

je pense qu'elle ont été mal créées, acr si j'ai bien compris ce que tu explique, la théorie m'a l'air bonne.

mets nous le code que tu as utlisé pour créer tes clefs, le probleme vient peut etre de la.

precise aussi ton SGBD, ca pourra nous servir pour te repondre.

a plus
0
bmikl59 Messages postés 77 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 14 février 2008
15 déc. 2005 à 15:34
Ben voila tout le code qui crée dynamiquement ma bdd
(ya vraiment tout)

Dim wrkSpace As Workspace
Dim dbDroit As Database
Dim db_prop As Property
Dim Tbl_prod As TableDef
Dim Tbl_fct As TableDef
Dim Tbl_droit As TableDef
Dim newRel As Relation
Dim idx As Index
Dim idxLoop As Index

'on commence par récupérer le workspace
'par défaut

Set wrkSpace = DBEngine.Workspaces(0)

'création bdd

'on supprime la bdd si elle existe déjà
If Dir("Droit_acces.mdb") <> "" Then Kill "Droit_acces.mdb"

'puis on la crée
Set dbDroit = wrkSpace.CreateDatabase("Droit_acces.mdb", _
dbLangGeneral, dbEncrypt)

'************************************
'* création de la table produit *
'************************************

Set Tbl_prod = dbDroit.CreateTableDef("Produit")

'insertion des champs
With Tbl_prod
.Fields.Append .CreateField("num_prod", dbText, 8)
'création de l'index primaire pour la table produit
Set idx = .CreateIndex("indexProduit")
idx.Fields.Append idx.CreateField("num_prod")
idx.Unique = True
.Indexes.Append idx
End With
dbDroit.TableDefs.Append Tbl_prod

'************************************
'* création de la table fonction *
'************************************

Set Tbl_fct = dbDroit.CreateTableDef("Fonction")
'insertion des champs
With Tbl_fct
.Fields.Append .CreateField("cde_fct", dbText, 5)
.Fields.Append .CreateField("lib_fct", dbText, 30)
'crétaion de l'index primaire pour la table fonction
Set idx = .CreateIndex("indexFonction")
idx.Fields.Append idx.CreateField("cde_fct")
idx.Unique = True
.Indexes.Append idx
End With
dbDroit.TableDefs.Append Tbl_fct

'************************************
'* création de la table droit *
'************************************

Set Tbl_droit = dbDroit.CreateTableDef("Droit")
'insertion des champs
With Tbl_droit
.Fields.Append .CreateField("num_prod", dbText, 8)
.Fields.Append .CreateField("cde_fct", dbText, 5)
.Fields.Append .CreateField("dat_deb", dbText, 10)
.Fields.Append .CreateField("dat_fin", dbText, 10)

'création de l'index primaire de la table droit
Set idx = .CreateIndex("indexDroit_P")
idx.Fields.Append idx.CreateField("num_prod")
idx.Fields.Append idx.CreateField("cde_fct")
idx.Unique = True
.Indexes.Append idx

'création des index etranger
Set idx = .CreateIndex("indexDroit_F1")
idx.Fields.Append idx.CreateField("num_prod")
.Indexes.Append idx

Set idx = .CreateIndex("indexDroit_F2")
idx.Fields.Append idx.CreateField("cde_fct")
.Indexes.Append idx
End With
dbDroit.TableDefs.Append Tbl_droit

'************************************
'* création des relations *
'************************************

Set newRel = dbDroit.CreateRelation("ProduitDroit", _
Tbl_prod.Name, Tbl_droit.Name, _
dbRelationUpdateCascade)
newRel.Fields.Append newRel.CreateField("num_prod")
newRel.Fields![num_prod].ForeignName = "num_prod"
dbDroit.Relations.Append newRel


Set newRel = dbDroit.CreateRelation("FonctionDroit", _
Tbl_fct.Name, Tbl_droit.Name, _
dbRelationUpdateCascade)
newRel.Fields.Append newRel.CreateField("cde_fct")
newRel.Fields![cde_fct].ForeignName = "cde_fct"
dbDroit.Relations.Append newRel

Je suis pas sur de devoir créer les indexDroit_F1 et _F2
Et puis je suis pas sur non plus de mes relations
0
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 1
15 déc. 2005 à 15:45
Je ne connais pas Access de fond en comble.. mais une clé primaire n'est nécessaire que pour identifier chaque ligne comme étant bien différente de toutes les autres (et donc obligatoire pour s'y repérer et pouvoir faire des update en code..)
En ce qui concerne les liaisons, elles, ne nécessitent qu'une bonne concordance des données, pas de champs 'vérolés' ou ayant des noms différents de ce qu'ils devraient avoir..

Ainsi, il est sûr que les champs num_prod et cde_fct ne peuvent pas te servir de clé primaire pour la table droit pour cause de doublons.. mais rien ne t'empêche d'ajouter une colonne 'ID(générée même automatiquement avec Access 2000 et +), ou 'Cle prim, indexée de 1 au nombre de champs et unique.

Il n'est absolument pas nécessaire de lier les tables qu'avec des clés primaires.. chaque table doit avoir sa clé, certes, mais pour les liaisons, tu restes assez libre (en contrôlant bien chaque nouvel élément ajouté à ta table)

enfin je ne comprends pas vraiment ton problème..
.Maytheforcebewithyou.Maxime.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bmikl59 Messages postés 77 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 14 février 2008
15 déc. 2005 à 16:02
ben dison qu'un produit peut avoir plusieur fonction et une fonction peut etre utilisé par plusieur produit.

Dans mon appli j'ai, en entrée, un num_prod.
En sortie, il me faut toute les fonction de ce produit.

C'est à ça que va me servir la table droit, quand tu as une relation de plusieur a plusieur, tu passe par une table intermediaire contenant 1 clé primaire (association des cle primaire des deux table a lié) et deux cle etrangere chacune lie au autre table.

Et mon probleme, c'est que ma table droit ne doit pas etre correcte car je ne peux pas enregistrer plusieur fct pour 1 produit.
0
bmikl59 Messages postés 77 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 14 février 2008
15 déc. 2005 à 16:38
Yes je viens juste de me faire la meme remarque. Les deux index (censé etre secondaire) ne sert qu'a foutre la merde.
Je fais des test en les enlevant (je n'ai plus qu'un index dans ma table droit au lieu de 3)

On dirai que ca marche....

Merci pour tout et j'espere que cet exemple de code servira a d'autre
0
Rejoignez-nous