Une clé primaire sur plusieurs champs :
Il suffit d'ajouter les champs à la collection Fields de l'objet Index correspondant
Version imprimable
Une clé primaire sur plusieurs champs :
Il suffit d'ajouter les champs à la collection Fields de l'objet Index correspondant
ok merci je vais tester...
et pour les relations une tite idée ?
Merci d'avance...
Bonjour à tous...
Vous trouverez en image jointe le résultat que j'ai avec le code et ce que je souhaiterais à la place ;-) Il s'agit donc bien d'une modification de la relation existante (dans le MCDSouhaite.jpg) et non pas d'une 2ème relation...
Je sais pas si c'est très clair !
Je vous redonne le code actuel...
Par avance merci.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 '=====> FONCTION "PARENTS" DE MISE EN PLACE DES RELATIONS DU MCD (boucle sur tblRelation pour définition des relations) <===== Private Function CreerRelationTable() Set oRst = oDb.OpenRecordset("tblRelation", dbOpenTable) With oRst While Not .EOF CreerRelationTableSub .MoveNext Wend End With pgbAvancement.Value = pgbAvancement.Value + 2.5 'Libération des objets oRst.Close Set oRst = Nothing End Function '=====> FONCTION "ENFANTS" DE MISE EN PLACE DES RELATIONS DU MCD <===== Private Function CreerRelationTableSub() 'Crée la relation Set oRlt = oDb.CreateRelation oRlt.Attributes = dbRelationDontEnforce oRlt.ForeignTable = oRst.Fields("TableSecondaire").Value oRlt.Name = oRst.Fields("ChampPrincipal").Value oRlt.Table = oRst.Fields("TablePrincipale").Value 'Crée le champ dans la relation Set oFld = oRlt.CreateField(oRst.Fields("ChampPrincipal").Value) 'Définit le nom de la clé externe oFld.ForeignName = oRst.Fields("ChampSecondaire").Value 'Ajoute le champ oRlt.Fields.Append oFld 'Rafraîhit la collection Relations oDb.Relations.Refresh 'Ajoute la relation oDb.Relations.Append oRlt 'Rafraîhit la collection Relations oDb.Relations.Refresh 'Libération des objets Set oFld = Nothing Set oRlt = Nothing End Function
Slt,
C'est normale tu crées une relation pour chaque enregistrement de ta tabl tblRelation.
Il faut créer une seule relation (donc une seule instruction oDB.CreateRelation) par couple Table Principale/Table Secondaire.
Par exemple:
(remarque que j'ai remis tous les objets en variable locale, c'est maladif chez moi)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 Option Compare Database Option Explicit '=====> FONCTION "PARENTS" DE MISE EN PLACE DES RELATIONS DU MCD (boucle sur tblRelation pour définition des relations) <===== Private Function CreerRelationTable() Dim oDB As DAO.Database Dim oRst As DAO.Recordset Set oDB = CurrentDb Set oRst = oDB.OpenRecordset("select distinct TablePrincipale, TableSecondaire from tblRelation") With oRst While Not .EOF CreerRelationTableSub !TablePrincipale, !TableSecondaire .MoveNext Wend End With 'Libération des objets oRst.Close Set oRst = Nothing Set oDB = Nothing End Function '=====> FONCTION "ENFANTS" DE MISE EN PLACE DES RELATIONS DU MCD <===== Private Function CreerRelationTableSub(pTablePrincipale As String, pTableSecondaire As String) Dim oDB As DAO.Database Dim oRst As DAO.Recordset Dim oRlt As DAO.Relation Dim oFld As DAO.Field Set oDB = CurrentDb 'Crée la relation Set oRlt = oDB.CreateRelation oRlt.Attributes = dbRelationDontEnforce oRlt.ForeignTable = pTableSecondaire oRlt.Name = pTablePrincipale & ":" & pTableSecondaire oRlt.Table = pTablePrincipale Set oRst = oDB.OpenRecordset("select ChampPrincipal, ChampSecondaire from tblRelation" & _ " Where TablePrincipale = '" & pTablePrincipale & "'" & _ " And TableSecondaire = '" & pTableSecondaire & "'") While Not oRst.EOF 'Crée le champ dans la relation Set oFld = oRlt.CreateField(oRst.Fields("ChampPrincipal").Value) 'Définit le nom de la clé externe oFld.ForeignName = oRst.Fields("ChampSecondaire").Value 'Ajoute le champ oRlt.Fields.Append oFld oRst.MoveNext Wend 'Rafraîhit la collection Relations oDB.Relations.Refresh 'Ajoute la relation oDB.Relations.Append oRlt 'Rafraîhit la collection Relations oDB.Relations.Refresh 'Libération des objets oRst.Close Set oRst = Nothing Set oDB = Nothing Set oFld = Nothing Set oRlt = Nothing End Function
Par contre il manque une chose, c'est le cas où tu veux créer plusieurs relations entre deux tables.
Par exemple une relation double et une relation simple; ici le code va créer une relation triple.
Il manque sûrement un champ dans la table tblRelation non?
Pour pouvoir préciser quels champs appartiennent à la même relation?
Bonjour Arkham46, Bonjour à tous...
Effectivement cela est ok avec ce nouveau code.
Je peux avoir ta vision pour le champ en plus ? Je ne vois pas comment apporter la précision...il faudrait faire une sorte de nomenclature ???
Merci
P.S. pour quelles raisons remets-tu tous les objets en local ? (je sais je suis curieux...;-))
slt,
pour le champ en plus, ce serait pour faire des groupements :
Ensuite au lieu de prendre les couples distincts de TablePrincipale/TableSecondaire tu fais une relation pour chaque TablePrincipale/TableSecondaire/IdRelation différents.Code:
1
2
3
4
5
6
7
8
9 TablePrincipale TableSecondaire ChampPrincipal ChampSecondaire IdRelation ------------------------------------------------------------------------------------- Table1 Table2 Champ1 Champ1 1 Table1 Table2 Champ2 Champ2 1 Table1 Table2 Champ3 Champ3 2 Table2 Table3 Champ4 Champ4 1 Table2 Table3 Champ5 Champ5 2
En passant le IdRelation en paramètre de la fonction et en l'ajoutant au nom de la relation pour qu'il soit unique.
Là on aurait une relation double et une relation simple à partir de Table1.
Et deux relations simples à partir de Table2.
Tout dépend de si c'est que tu souhaites faire. :question:
Pour les variables en local ben c'est mieux :
- chaque fonction est indépendante
- chaque objet n'est créé que quand on en a besoin et est libéré aussitôt qu'il ne sert plus
- on n'oublie pas de libérer des objets
- c'est plus facile à lire à mon goût
Autre solution sans rajouter de champ. Au moment de la création d'une relation, on teste si elle existe déjà. Si elle existe déjà cela signifie qu'en fait on veux ajouter un couple champ pere / Fils dans la relation. Dans ce cas, on ne la crée pas, on rajoute juste le champ à la collection Fields ;)
Ceci dit, l'intéret des numéro auto est de créer des valeurs uniques sur un seul champ. On a donc une clé primaire mono champ, dés lors les relations multichamps, sont inutile.
Toutes les tables devrait posséder un numéro automatique comme clé primaire. Cela allège considérablement le système ;)
Merci Messieurs...
->Tofalu : ce sont des tables importées d'une système externe donc je ne souhaite pas les modifier quant à leur structure ce qui explique que j'ai du multichamps en relation ;-)
->Arkham : Oui c'est ce que je souhaite éventuellement faire, je vais essayer et si besoin je viendrais de nouveau vous voir ;-)
Tes arguments pour les variables en local me conviennent, je suis contaminé par ta maladie alors ;-)
Merci encore...
@+