OVH Cloud OVH Cloud

Relation entre tables

4 réponses
Avatar
Alain TEYSSEDRE
Bonjour

Je souhaite en code VBA supprimer puis rétablir la ou les relations
existantes entre 2 tables : Table1 et Table2
sachant que ja ne connais à priori, ni le nombre ni le type de relations.

Merci pour votre aide

Alain

4 réponses

Avatar
Bonjour Alain,

Vois la collection "Relations" dans l'aide Access.

Il te faudra parcourir la Collection "Relations",
rechercher les relations mettant en jeu les table1 et
table2. Pour chaque occurrence trouvée, mémoriser les
infos (dans des tableaux dynamiques par exemple, ou dans
des tables). Détruire les relations mémoriser, faire ce
que tu as à faire, puis restaurer les relations à partir
des infos mémorisées.

Quelques pistes ici:
http://minilien.com/?U8krUU2uXZ
http://minilien.com/?zLtu14NEL4
http://minilien.com/?CMH1u4rph3

Il y a du boulot!


Bon courage.
Cordialement.
Avatar
Michel Walsh
Salut,


Parcourir CurrentDb.Relations, vérifier celles qui sont associées à
Table et éliminer (voir le code plus bas pour énumérer les composants de
chaque relation). Attention, si on parcourt la collection avec un indice, il
faut la parcourir dans l'ordre inverse (du haut vers le base) de cette
façon, éliminer quelque chose plus haut ne modifie pas ce qui est "dessous"
et la position du compteur n'a pas à être modifiée, donc, faire For
iÛ.Relations.Count-1 To 0 STEP -1 (si on utilise un indice, au lieu d'un
énumérateur, For Each).


Tiré du fichier d'aide, noter qu'une relation peut impliquer plus d'un
champ, par table, d'où la présence d'une sous-collection, Fields( ) :

=============================== Sub ForeignNameX()

Dim dbsNorthwind As Database
Dim relLoop As Relation

Set dbsNorthwind = OpenDatabase("Northwind.mdb")

Debug.Print "Relation"
Debug.Print " Table - Field"
Debug.Print " Primary (One) ";
Debug.Print ".Table - .Fields(0).Name"
Debug.Print " Foreign (Many) ";
Debug.Print ".ForeignTable - .Fields(0).ForeignName"

' Enumerate the Relations collection of the Northwind
' database to report on the property values of
' the Relation objects and their Field objects.
For Each relLoop In dbsNorthwind.Relations
With relLoop
Debug.Print
Debug.Print .Name & " Relation"
Debug.Print " Table - Field"
Debug.Print " Primary (One) ";
Debug.Print .Table & " - " & .Fields(0).Name
Debug.Print " Foreign (Many) ";
Debug.Print .ForeignTable & " - " & _
.Fields(0).ForeignName
End With
Next relLoop

dbsNorthwind.Close

End Sub===========Espérant être utile,Vanderghast, Access MVP
Avatar
Alain TEYSSEDRE
à Michel et anonymous

Merci Michel pour tes conseils (le truc de for i = ...) et pour ton petit
exemple de code

je vais tester cela mais je crois que je me lance dans une voie trop
compliquée.

Comme le dit anonymous "y a du boulot .."

je voulais me faire un utilitaire pour pouvoir mettre passer d'une version n
à une
version n+1 de mon appli en récuprérant toutes mes données existantes.

Car en plus des relation j'ai le pb des changements de propriétes des champs
à gérer ...

Si sur le sujet (mise à jour d'appli) tu as des pistes ça m'intéresse

Merci à tous les deux pour votre aide

@+
Alain


"Michel Walsh" a écrit dans le message
de news:e$
Salut,


Parcourir CurrentDb.Relations, vérifier celles qui sont associées
à

Table et éliminer (voir le code plus bas pour énumérer les composants de
chaque relation). Attention, si on parcourt la collection avec un indice,
il

faut la parcourir dans l'ordre inverse (du haut vers le base) de cette
façon, éliminer quelque chose plus haut ne modifie pas ce qui est
"dessous"

et la position du compteur n'a pas à être modifiée, donc, faire For
iÛ.Relations.Count-1 To 0 STEP -1 (si on utilise un indice, au lieu d'un
énumérateur, For Each).


Tiré du fichier d'aide, noter qu'une relation peut impliquer plus d'un
champ, par table, d'où la présence d'une sous-collection, Fields( ) :

=============================== > Sub ForeignNameX()

Dim dbsNorthwind As Database
Dim relLoop As Relation

Set dbsNorthwind = OpenDatabase("Northwind.mdb")

Debug.Print "Relation"
Debug.Print " Table - Field"
Debug.Print " Primary (One) ";
Debug.Print ".Table - .Fields(0).Name"
Debug.Print " Foreign (Many) ";
Debug.Print ".ForeignTable - .Fields(0).ForeignName"

' Enumerate the Relations collection of the Northwind
' database to report on the property values of
' the Relation objects and their Field objects.
For Each relLoop In dbsNorthwind.Relations
With relLoop
Debug.Print
Debug.Print .Name & " Relation"
Debug.Print " Table - Field"
Debug.Print " Primary (One) ";
Debug.Print .Table & " - " & .Fields(0).Name
Debug.Print " Foreign (Many) ";
Debug.Print .ForeignTable & " - " & _
.Fields(0).ForeignName
End With
Next relLoop

dbsNorthwind.Close

End Sub===========Espérant être utile,Vanderghast, Access MVP




Avatar
Michel Walsh
Salut,



Ce n'est pas ce qu'il y a de plus simple, car certaines propriétés ne
peuvent être spécifiées qu'au moment de la création d'un champ, par exemple,
du moins, dans certaines versions. Cela devient vite du "essaie et erreur".
Personnellement, j'essaie d'utiliser du SQL en autant que faire se peut (
c'est un peu plus indépendant de la base de données même, mais ce n'est pas
parfait non plus, loin de là), avec ALTER TABLE et compagnie.


Espérant être utile,
Vanderghast, Access MVP.


"Alain TEYSSEDRE" wrote in message
news:%
à Michel et anonymous

Merci Michel pour tes conseils (le truc de for i = ...) et pour ton petit
exemple de code

je vais tester cela mais je crois que je me lance dans une voie trop
compliquée.

Comme le dit anonymous "y a du boulot .."

je voulais me faire un utilitaire pour pouvoir mettre passer d'une version
n

à une
version n+1 de mon appli en récuprérant toutes mes données existantes.

Car en plus des relation j'ai le pb des changements de propriétes des
champs

à gérer ...

Si sur le sujet (mise à jour d'appli) tu as des pistes ça m'intéresse

Merci à tous les deux pour votre aide

@+
Alain


"Michel Walsh" a écrit dans le
message

de news:e$
Salut,


Parcourir CurrentDb.Relations, vérifier celles qui sont
associées


à
Table et éliminer (voir le code plus bas pour énumérer les composants
de


chaque relation). Attention, si on parcourt la collection avec un
indice,


il
faut la parcourir dans l'ordre inverse (du haut vers le base) de cette
façon, éliminer quelque chose plus haut ne modifie pas ce qui est
"dessous"

et la position du compteur n'a pas à être modifiée, donc, faire For
iÛ.Relations.Count-1 To 0 STEP -1 (si on utilise un indice, au lieu
d'un


énumérateur, For Each).


Tiré du fichier d'aide, noter qu'une relation peut impliquer plus d'un
champ, par table, d'où la présence d'une sous-collection, Fields( ) :

=============================== > > Sub ForeignNameX()

Dim dbsNorthwind As Database
Dim relLoop As Relation

Set dbsNorthwind = OpenDatabase("Northwind.mdb")

Debug.Print "Relation"
Debug.Print " Table - Field"
Debug.Print " Primary (One) ";
Debug.Print ".Table - .Fields(0).Name"
Debug.Print " Foreign (Many) ";
Debug.Print ".ForeignTable - .Fields(0).ForeignName"

' Enumerate the Relations collection of the Northwind
' database to report on the property values of
' the Relation objects and their Field objects.
For Each relLoop In dbsNorthwind.Relations
With relLoop
Debug.Print
Debug.Print .Name & " Relation"
Debug.Print " Table - Field"
Debug.Print " Primary (One) ";
Debug.Print .Table & " - " & .Fields(0).Name
Debug.Print " Foreign (Many) ";
Debug.Print .ForeignTable & " - " & _
.Fields(0).ForeignName
End With
Next relLoop

dbsNorthwind.Close

End Sub===========Espérant être utile,Vanderghast, Access MVP