[Access] Lier et délier des tables Access
Résolu/Fermé
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
-
21 déc. 2006 à 12:13
_goni Messages postés 964 Date d'inscription jeudi 21 décembre 2006 Statut Membre Dernière intervention 30 juillet 2009 - 17 janv. 2007 à 17:47
_goni Messages postés 964 Date d'inscription jeudi 21 décembre 2006 Statut Membre Dernière intervention 30 juillet 2009 - 17 janv. 2007 à 17:47
A voir également:
- [Access] Lier et délier des tables Access
- Table des matières word - Guide
- Access appdata - Guide
- Quick access service - Forum Logiciels
- Avis stream access ✓ - Forum Virus
- Bios access - Guide
17 réponses
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
17 janv. 2007 à 17:47
17 janv. 2007 à 17:47
Salut à tous,
En fait, je donne la solution au cas où quelqu'un aurait le même problème. J'explique rapidement le fonctionnement. JE supprime toutes les tables liées pour recreer le lien.
Niveau code ça donne :
Voila. Encore une fois, merci pour ton aide Blux.
En fait, je donne la solution au cas où quelqu'un aurait le même problème. J'explique rapidement le fonctionnement. JE supprime toutes les tables liées pour recreer le lien.
Niveau code ça donne :
'supprimer les tables liées Dim BD As DAO.Database Set BD = CurrentDb Dim tb As DAO.TableDef For Each tb In BD.TableDefs If Left(tb.Name, 4) <> "MSys" Then If Len(tb.Connect) > 0 Then DoCmd.RunSQL "DROP TABLE [" & tb.Name & "] ;" Debug.Print "effacement de " & tb.Name & " -=#=> " & tb.Connect End If End If Next tb Dim strMotPasse As String Dim strConnect As String Dim strNomsTables() As String Dim strTemp As String Dim i As Integer Dim oDb As DAO.Database Dim oDbSource As DAO.Database Dim oTbl As DAO.TableDef Dim oTblSource As DAO.TableDef strMotPasse = "pass" 'dans strFichierTables on trouve le chemin de ma source style "C:\test.mdb" strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=" & strFichierTables Set oDb = CurrentDb Set oDbSource = DBEngine.OpenDatabase(strFichierTables, True, True, strConnect) For Each oTblSource In oDbSource.TableDefs If (oTblSource.Attributes And dbSystemObject) = 0 Then strTemp = strTemp & oTblSource.Name & "|" End If Next oDbSource.Close: Set oDbSource = Nothing strNomsTables = Split(Left(strTemp, Len(strTemp) - 1), "|") For i = 0 To UBound(strNomsTables) Set oTbl = oDb.CreateTableDef(strNomsTables(i)) oTbl.Connect = strConnect oTbl.SourceTableName = strNomsTables(i) oDb.TableDefs.Append oTbl Next i oDb.TableDefs.Refresh
Voila. Encore une fois, merci pour ton aide Blux.
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
21 déc. 2006 à 13:46
21 déc. 2006 à 13:46
Salut,
on peut obtenir le chemin de connexion et le changer le cas échéant :
on peut obtenir le chemin de connexion et le changer le cas échéant :
Set Db = CurrentDb ' Test des attachements ' On exclut les tables système ' ainsi que les tables non attachées For Each Tb In Db.TableDefs 'MsgBox Tb.Name If Left(Tb.Name, 4) <> "MSys" Then If Tb.Connect <> "" Then MsgBox Tb.Properties("Connect") ' Tb.Connect = ";Database=c:\toto\mabase.mdb" End If End If NextPour délier des tables , il suffit de mettre le même nom que la base en cours, soit, dans mon exemple Db.Name, voire mettre à blanc la zone connect... (jamais testé par mes soins !)
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 16:18
27 déc. 2006 à 16:18
voila mon code :
si je fais l'affichage, de TableData.Properties("Connect") alors j'ai une msgBox avec le chemin que je veux. Enfin si j'ai bien fais ce que tu attendais de moi...
Set esp = DBEngine.Workspaces(0) Set dbData = esp.OpenDatabase(strFichierTables) ' Test des attachements ' On exclut les tables système ' ainsi que les tables non attachées For Each TableData In dbData.TableDefs 'MsgBox Tb.Name If Left(TableData.Name, 4) <> "MSys" Then 'If TableData.Connect <> "" Then 'MsgBox TableData.Properties("Connect") TableData.Connect = ";DATABASE=" & strFichierTables CurrentDb.TableDefs.Refresh 'End If End If Next
si je fais l'affichage, de TableData.Properties("Connect") alors j'ai une msgBox avec le chemin que je veux. Enfin si j'ai bien fais ce que tu attendais de moi...
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
21 déc. 2006 à 14:17
21 déc. 2006 à 14:17
Bon ben, il faut déjà que je progresse en programation avant de pouvoir mettre en oeuvre un truc comme ça. Je continue à essayer.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
22 déc. 2006 à 09:37
22 déc. 2006 à 09:37
Au fait, je n'ai même pas dis merci donc merci beaucoup blux
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
22 déc. 2006 à 09:40
22 déc. 2006 à 09:40
Tu diras merci quand ça marchera ! ;-)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
>
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
22 déc. 2006 à 09:45
22 déc. 2006 à 09:45
Salut blux,
le code que tu as écrit vaut un petit merci quand même :-))
le code que tu as écrit vaut un petit merci quand même :-))
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
22 déc. 2006 à 10:03
22 déc. 2006 à 10:03
Bon ben, si t'insistes...
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
26 déc. 2006 à 14:07
26 déc. 2006 à 14:07
Salut,
J'ai mis en place du code en m'ispirant fortement du tiens mais j'ai toujours cette meme erreur quand je veux lier les tables,il me dit que la première table existe déjà et il s'arrete la. En fait ca change pas le chemin. Voici mon code :
mon formulaire
mon module
Tout ça c'est du code qui existait déjà et je dois dire que je ne comprends pas tout
J'ai mis en place du code en m'ispirant fortement du tiens mais j'ai toujours cette meme erreur quand je veux lier les tables,il me dit que la première table existe déjà et il s'arrete la. En fait ca change pas le chemin. Voici mon code :
mon formulaire
Private Sub BAttacherTables_Click() Dim esp As Workspace Dim dbData As Database, TableData As TableDef, TableCree As TableDef On Error GoTo GestionErreur Set esp = DBEngine.Workspaces(0) Set dbData = esp.OpenDatabase(strFichierTables) For Each TableData In dbData.TableDefs If TableData.Attributes = 0 Then Set TableCree = CurrentDb.CreateTableDef(TableData.Name) TableCree.Connect = ";DATABASE=" & strFichierTables TableCree.SourceTableName = TableData.Name CurrentDb.TableDefs.Append TableCree End If Next Set dbData = Nothing CurrentDb.TableDefs.Refresh MsgBox "Attache des tables réalisé avec succès !", vbInformation, "Attache des tables" GestionErreur_exit: Exit Sub GestionErreur: MsgBox "Erreur n°" & Err.Number & ":" & vbCrLf _ & Err.Description Resume GestionErreur_exit End Sub
mon module
Function Attaches() As Boolean Dim Chemin As String Dim TableLiée As String Dim tdf As TableDef Dim sPathBase As String On Error GoTo gestERR Chemin = ";DATABASE=" & _ "B:\A\B\FC\APPLI_FC25\Comptes_sociaux_nouvelle appli\31-12-2005 complémentaire\" & "ComptesSociaux_Donnees.mdb" For Each tdf In CurrentDb.TableDefs If tdf.Connect <> "" Then If InStr(1, tdf.Name, "MSys") = 0 And tdf.Connect <> "" Then Debug.Print tdf.Name DoEvents tdf.Connect = Chemin tdf.RefreshLink End If End If Next Attaches = True GestExit: MsgBox "Fini" Exit Function gestERR: MsgBox Err.Description, vbCritical, "erreur" Resume GestExit Resume Next End Function
Tout ça c'est du code qui existait déjà et je dois dire que je ne comprends pas tout
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
27 déc. 2006 à 08:21
27 déc. 2006 à 08:21
Ben moi non plus, car ta procédure semble créer des tables :
J'ai pas tout compris l'objet du code...
CurrentDb.TableDefs.Append TableCreeCa me parait donc normal qu'il te jette si une table existe déjà...
J'ai pas tout compris l'objet du code...
J'ai mis en place le code que tu m'as donné. Ca donne :
Malheureusement pas de changement en vu pour le chemin de mes tables. Je pense que ca vient du reste de mon code.
En tout cas merci de m'avoir consacré un peu de temps
Set dbData = esp.OpenDatabase(strFichierTables) ' Test des attachements ' On exclut les tables système ' ainsi que les tables non attachées For Each TableData In dbData.TableDefs 'MsgBox Tb.Name If Left(TableData.Name, 4) <> "MSys" Then If TableData.Connect <> "" Then 'MsgBox TableData.Properties("Connect") TableData.Connect = ";DATABASE=" & strFichierTables End If End If Next
Malheureusement pas de changement en vu pour le chemin de mes tables. Je pense que ca vient du reste de mon code.
En tout cas merci de m'avoir consacré un peu de temps
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
27 déc. 2006 à 12:25
27 déc. 2006 à 12:25
Il faut rajouter un 'TableData.Refresh' après le .Connect.
Ca n'est pas présent dans mon exemple, je l'ai recopié depuis une base, en allégeant le code, et la ligne a dû sauter...
Ca n'est pas présent dans mon exemple, je l'ai recopié depuis une base, en allégeant le code, et la ligne a dû sauter...
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 13:40
27 déc. 2006 à 13:40
je le fait juste en dessous de mon bout de code. En fait, quand j'execute cette partie du programme il ne rentre jamais dans la condition
If TableData.Connect <> "" ThenSi je l'enlève, j'ai une erreur. As tu une idée ?
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
27 déc. 2006 à 14:49
27 déc. 2006 à 14:49
C'est normal, si tes tables sont déjà liées, le contenu de la propriété .connect n'est pas vide, donc tu ne satisfais pas à la condition...
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 15:20
27 déc. 2006 à 15:20
Oui mais si je l'enlève j'ai une erreur. Ce que je veux faire c'est changer le chemin de liaison des tables existantes. Donc si tu peux encore m'aider stp
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
>
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
27 déc. 2006 à 15:30
27 déc. 2006 à 15:30
C'est quoi ton erreur ?
Tu as aussi enlevé le end if qui va avec ?
Quand est-ce que tu appelles ta procédure ? Car le code (que tu nommes mon module) donné au message 7 n'est jamais appelé...
Tu as aussi enlevé le end if qui va avec ?
Quand est-ce que tu appelles ta procédure ? Car le code (que tu nommes mon module) donné au message 7 n'est jamais appelé...
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 15:47
27 déc. 2006 à 15:47
En fait j'appel pas mon module (message 7). C'est une erreur de ma part. Sinon, quand j'enlève la condition, l'erreur est :
Erreur n°3219:
Opération non valide
Voila
Erreur n°3219:
Opération non valide
Voila
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
27 déc. 2006 à 16:06
27 déc. 2006 à 16:06
Tu peux mettre le code que tu emploies après avoir ôté le test de non vide ?
Et si tu affiches tabledata.connect pour chaque table, tu as quoi ?
Et si tu affiches tabledata.connect pour chaque table, tu as quoi ?
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
27 déc. 2006 à 16:29
27 déc. 2006 à 16:29
Je t'ai suggéré un tabledata.refreshlink, pas un currentdb.tables.refresh (qui n'est pas forcément obligatoire)...
De plus, je pense qu'il peut y avoir confusion entre ta base notée dbdata et currentdb...
Supprime l'affectation de dbdata et remplace par set dbdata=currentdb
De plus, je pense qu'il peut y avoir confusion entre ta base notée dbdata et currentdb...
Supprime l'affectation de dbdata et remplace par set dbdata=currentdb
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 16:54
27 déc. 2006 à 16:54
Alors je me trouve face à une nouvelle erreur.
Je suis sure de mon chemin d’accès vu que je le fais à l’aide d’un système comme « parcourir ». Ce n’est donc pas moi qui entre le chemin manuellement.
Par contre mon chemin contient des espaces :
Erreur n°3011 : Le moteur de base de données Microsoft Jet n’a pas pu trouver l’objet ’31-12-2005-a120#txt’. Assurez vous que l’objet existe et que vous avez correctement saisi son chemin d’accès.
Je suis sure de mon chemin d’accès vu que je le fais à l’aide d’un système comme « parcourir ». Ce n’est donc pas moi qui entre le chemin manuellement.
Par contre mon chemin contient des espaces :
F:\Projet\31-12-2005 complémentaire
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 16:55
27 déc. 2006 à 16:55
petite précision, je n'ai pas le droit de supprimer ce petit espace qui doit etre la raison de cet erreur.
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 16:58
27 déc. 2006 à 16:58
Je viens de me rendre compte aussi que le chemin change cette fois-ci. Donc plus qu'a savoir d'où vient cet erreur
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
27 déc. 2006 à 17:03
27 déc. 2006 à 17:03
Ton erreur est en quelle ligne ?
As-tu fait les modifs suggérées en 18 ?
As-tu fait les modifs suggérées en 18 ?
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 17:06
27 déc. 2006 à 17:06
J'ai fait les modifs, c'est ce qui ma fait avoir cet erreur mais je crois vraiment que ca doit venir de mes espaces dans le nom du chemin. Je dois mal prendre ca en compte. Pour ce qui est de la ligne je vais regarder
_goni
Messages postés
964
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
30 juillet 2009
38
27 déc. 2006 à 17:10
27 déc. 2006 à 17:10
alors c'est au niveau du premier passage sur la ligne TableData.RefreshLink
blux
Messages postés
25989
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
22 avril 2024
3 288
27 déc. 2006 à 17:29
27 déc. 2006 à 17:29
J'ai fait un test chez moi :
- avec un nom comprenant des espaces, il me met argument non valide sur la ligne refreshlink
- directement sous C:\, il me met pilote isam introuvable sur la ligne refreshlink (c'est une erreur de m*$*$ qui n'a rien à voir avec ce qu'on fait, elle est connue comme le houblon, il va falloir que je réinstalle ACCESS...)
... mais je ferai ça en 2007, je pars en congés ce soir, à l'année prochaine !
- avec un nom comprenant des espaces, il me met argument non valide sur la ligne refreshlink
- directement sous C:\, il me met pilote isam introuvable sur la ligne refreshlink (c'est une erreur de m*$*$ qui n'a rien à voir avec ce qu'on fait, elle est connue comme le houblon, il va falloir que je réinstalle ACCESS...)
... mais je ferai ça en 2007, je pars en congés ce soir, à l'année prochaine !