Liaison des tables (Dorsale Frontale)
jadami
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
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
Merci pour votre aide.
Salutations
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)Pouvez-vous m’aider à trouver mon erreur ?
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
Merci pour votre aide.
Salutations
8 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour, que se passe-t-il quand tu exécutes ta fonctionAttacheTbl
pas à pas? -
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 -
Oui si les liaisons sont correctes et complètes on ne fait rien.
-
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 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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. -
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 -
elle peut chercher où elle se trouve
Peux-tu stp me donner un piste ?
Salutations -
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 surtbdTables.RefreshLink
est-ce normal ?
Désolé de te solliciter aussi souvent.
Salutations