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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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
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.
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
' 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
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
' 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
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
' 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
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
' 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
à 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" <vanderghast@VirusAreFunnierThanSpam> a écrit dans le message
de news:e$zT7B32DHA.2888@tk2msftngp13.phx.gbl...
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
' 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
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
' 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
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
' 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
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" <alain.teyssedre-NoSpam@libertysurf.fr> wrote in message
news:%23f3IUv42DHA.2888@tk2msftngp13.phx.gbl...
à 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" <vanderghast@VirusAreFunnierThanSpam> a écrit dans le
message
de news:e$zT7B32DHA.2888@tk2msftngp13.phx.gbl...
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
' 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
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
' 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