Liaison des tables (Dorsale Frontale)
jadami
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 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
A voir également:
- Liaison des tables (Dorsale Frontale)
- Table des matières word - Guide
- Tables ascii - Guide
- Buée camera frontale iphone 13 - Forum iPhone
- Liaison torride avis - Forum Vos droits sur internet
- Commentaire : acheminé sur une liaison internationale - Forum Consommation & Internet
8 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, que se passe-t-il quand tu exécutes ta fonction
AttacheTblpas à 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
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
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.
Est-ce que la logique est correcte ?
Salutations.
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.
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
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
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