Liaison des tables (Dorsale Frontale)

Fermé
jadami - 20 août 2017 à 14:15
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 - 23 août 2017 à 22:04
Bonjour,

Lorsqu’une liaison entre deux table à été supprimer celle-ci ne se rétablie pas.
Je joins le code que j’utilise à l’ouverture de mon frm
Private Sub Form_Timer()
Dim db As DAO.Database, rs As DAO.Recordset
Dim strCheminBd As String
Dim Path As String

Application.RefreshDatabaseWindow

'--- Permet d'acceder à la base en cours
Set db = CurrentDb

'--- On détermine le Chemin + le nom de la base
Path = ""
Path = CurrentProject.Path
strCheminBd = ""
strCheminBd = Left$(Path, InStr(Path, "Base 1 Partie Applicative (Frontale)") - 1) & "Base 2 Partie Donnée (Dorsale)" & "\" & "AAAA_princip.mdb"

If Not (GetCheminDBName("tbl Adhérents") = strCheminBd) Then

'--- Ouverture du recordset rs des tables à éxaminer...
Set rs = db.OpenRecordset("tbl Attachees")

'--- Boucle sur les champs de la table
While Not rs.EOF
DetacheTbl rs![NomTablesAttachees]
AttacheTbl rs![NomTablesAttachees], strCheminBd, rs![NomTablesAttachees]
rs.MoveNext
Wend
End If

Application.RefreshDatabaseWindow
DoCmd.Close
DoCmd.OpenForm ("frm Accueil général")
End Sub


Public Function AttacheTbl(ByVal strTable As String, strConnect As String, strSourceTable As String) As Boolean
' Attache une table à la base de données courante :
' strtable : nom local de la table à créer
' strconnect : localisation de la base où trouver la table à attacher
' strsourcetable : nom de la table dans la base source

On Error GoTo Err_Attachetbl

Dim dbTemp As Database
Dim tdfLinked As TableDef
Dim rsLinked As Recordset
Dim intTemp As Integer
Dim EndroitDorsale As String

EndroitDorsale = ";DATABASE=" & strConnect

Set dbTemp = CurrentDb

‘--- Crée un objet TableDef, définit ses propriétés Connect et SourceTableName
Set tdfLinked = dbTemp.CreateTableDef(strTable)
tdfLinked.Connect = EndroitDorsale
tdfLinked.SourceTableName = strSourceTable
dbTemp.TableDefs.Append tdfLinked

'--- table attachée ?
If Table_existe(strTable) <> "no found" Then
AttacheTbl = True
Else
AttacheTbl = False
End If
Exit Function

Err_Attachetbl:
AttacheTbl = False
Exit Function
End Function


Public Function DetacheTbl(ByVal strTable As String) As Boolean
' Supprime l'attache d'une table dont le nom est passé en paramètre

'--- si la table n'existe pas, Ion va pas plus loin
If Table_existe(strTable) = "no found" Then
DetacheTbl = True
Exit Function
End If

On Error GoTo Err_DetacheTbl

Dim dbTemp As Database
Set dbTemp = CurrentDb
dbTemp.TableDefs.Delete strTable
Set dbTemp = Nothing

' --- table détachée ?
If Table_existe(strTable) = "no found" Then
DetacheTbl = True
Else
DetacheTbl = False
End If
Exit Function

Err_DetacheTbl:
Set dbTemp = Nothing
DetacheTbl = False
Exit Function
End Function

Public Function Table_existe(ByVal strTable As String)
' Est-ce que la table donnée existe dans la base courante ?
On Error GoTo err_Table_existe
Dim db As Database, tdfLoop As TableDef, strrep As String
Set db = CurrentDb
strrep = "no found"

For Each tdfLoop In db.TableDefs
If UCase(tdfLoop.Name) = UCase(strTable) Then
strrep = strTable
Exit For
End If
Next tdfLoop

Set tdfLoop = Nothing
Set db = Nothing
Table_existe = strrep
Exit Function

err_Table_existe:
Set tdfLoop = Nothing
Set db = Nothing
Table_existe = "error"
End Function


Function GetCheminDBName(tblName As String)
Dim db As Database, rs

On Error GoTo DBNameErr

'--- On récupère le chemin
Set db = CurrentDb()
rs = db.TableDefs(tblName).Connect
GetCheminDBName = Right(rs, Len(rs) - (InStr(1, rs, "DATABASE=") + 8))
Exit Function

'Erreur
DBNameErr:

'--- Renvoi la fonction si erreur
GetCheminDBName = 0
End Function

Pouvez-vous m’aider à trouver mon erreur ?

Merci pour votre aide.

Salutations

8 réponses

yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
20 août 2017 à 20:09
bonjour, que se passe-t-il quand tu exécutes ta fonction
AttacheTbl
pas à pas?
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
21 août 2017 à 01:27
Bonjour,

Le pas à pas sur AttacheTbl donne ceci:

1-Toutes les tables liées, le code ne passe pas sur AttacheTbl.

2- Une seule table déliée, idem le code ne passe pas sur AttacheTbl et la liaison ne se fait pas.

3- Toutes les tables déliées, le code passe sur AttacheTbl et toutes les liaisons se font correctement.

Salutations
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
21 août 2017 à 09:06
le soucis est peut-être avec ceci:
If Not (GetCheminDBName("tbl Adhérents") = strCheminBd)

pourquoi fais-tu cela?
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020 > yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024
21 août 2017 à 10:54
Bonjour,

If Not (GetCheminDBName("tbl Adhérents") = strCheminBd) 

Je voulais savoir si la bd avait bougé en testant son chemin.

En fait je voudrais utiliser AttacheTbl uniquement si un lien est rompu, ou si la base
a été déplacée.

Apparemment je m’y prends mal.

Salutations
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471 > jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
21 août 2017 à 11:28
si je comprends bien, tu ne fais rien si la base frontale et la base dorsale sont dans le même dossier. ai-je bien compris?
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
21 août 2017 à 12:50
Oui si les liaisons sont correctes et complètes on ne fait rien.
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
21 août 2017 à 13:30
je te suggère de supprimer le "if" mentionné en #3.
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
21 août 2017 à 14:32
If Not (GetCheminDBName("tbl Adhérents") = strCheminBd)

C'est bien de ce if dont on parle ?

Mais alors, à chaque ouverture de la base il y aura suppression et
création des liaisons.

Ne peut-on pas éviter cela ?

Salutations
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
21 août 2017 à 14:39
voyons d'abord si cela fonctionne sans le if.
ensuite tu essaieras de trouver une bonne logique pour détecter si un lien est rompu.
0

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

Posez votre question
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
22 août 2017 à 13:14
Bonjour,

En supprimant le if toutes les liaisons se font correctement.

"une bonne logique pour détecter si un lien est rompu."

Je pense qu’en faisant un test sur le nb de liaisons et le nb de tables de « tbl Attachees » cela pourrait marcher.

'Boucle sur les tables
For Each tbdTables In db.TableDefs

'Teste l'attribut pour savoir si c'est une table liée        
If tbdTables.Attributes And dbAttachedTable Then

'Compte les tbl liées       
NbdbAttachedTable = NbdbAttachedTable + 1

'Détermine le nb de tbl
NbTblAttachees = DCount("*", "Tbl Attachees")

'Compare les deux valeurs
If Not NbdbAttachedTable = NbTblAttachees Then
Code attacheTbl

Est-ce que la logique est correcte ?

Salutations.
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
22 août 2017 à 13:19
je me demande si tu ne dois pas faire .Connect pour vérifier qu'un lien n'est pas rompu. cela te permettrait aussi de rétablir uniquement les liens rompus.
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
23 août 2017 à 09:55
Bonjour,

Voilà ce que j’ai fait.

'--- Initialise le nb d'attache
NbdbAttachedTable = 0

'--- Boucle Parcourant toutes les tables de la Bd en cours
For Each tbdTables In db.TableDefs
'Teste L'attribut de la table pour savoir si c'est une table liée
If tbdTables.Attributes And dbAttachedTable Then
'Redéfini la propriété connect de la table avec la nouvelle base
tbdTables.Connect = ";DATABASE=" & strCheminBdDorsale
'Remet à jour la liaison de la table
tbdTables.RefreshLink
'Compte les tbl liées
NbdbAttachedTable = NbdbAttachedTable + 1
End If
Next tbdTables

'--- Compte le nb de tables "tbl Attachees"
NbTblAttachees = DCount("*", "Tbl Attachees")

'--- Compare les deux valeurs
If Not NbdbAttachedTable = NbTblAttachees Then

'--- Ouverture du recordset rs des tables à éxaminer...
Set rs = db.OpenRecordset("tbl Attachees")

'--- Boucle sur les champs de la table
While Not rs.EOF
DetacheTbl rs![NomTablesAttachees]
AttacheTbl rs![NomTablesAttachees], strCheminBdDorsale, rs![NomTablesAttachees]
rs.MoveNext
Wend
End If

Cela fonctionne, mais est-ce que c’est correct ?

Pour tester un lien rompu, y a t’il un moyen de rompre un lien sur une base ?

Mes bases frontale et dorsale sont dans un même répertoire et le code fonctionne correctement. Mais en mettant la dorsale sur un autre répertoire cela ne marche pas.

Peut-être faudrait-il ajouter une boite de dialogue pour changer le chemin ?


Salutations
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
23 août 2017 à 10:29
tu peux rompre un lien en changeant le nom de la table destination dans la base dorsale.

si tu déplaces ta base dorsale, ton code ne peut pas deviner où elle se trouve. elle peut chercher où elle se trouve, ou bien demander de l'information.
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
23 août 2017 à 13:36
elle peut chercher où elle se trouve

Peux-tu stp me donner un piste ?

Salutations
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
23 août 2017 à 17:10
eh bien , par exemple, si tu sais que la base est quelque part sur le disque C, le code VBA peut parcourir le disque pour chercher si un fichier d'un nom connu est présent quelque part.
0
jadami Messages postés 103 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 18 septembre 2020
23 août 2017 à 21:25
eh bien , par exemple, si tu sais que la base est quelque part sur le disque C

Merci pour les explications.
tu peux rompre un lien en changeant le nom de la table 

J'ai changer le nom de la table, et j'ai un message "Access na pas pu trouver la table x ,,,,,,,,," le code s'arrête sur
tbdTables.RefreshLink

est-ce normal ?

Désolé de te solliciter aussi souvent.

Salutations
0
yg_be Messages postés 22694 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
23 août 2017 à 22:04
à première vue, cela me semble normal, cela veut dire que le lien est rompu.
0