Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[Access] Lier et délier des tables Access

_goni, le jeudi 21 décembre 2006 à 12:13:59
Bonjour,

Dans mon travail, je dois réaliser une petite application Access. Pour cela, il me faut lier et delier des tables venant d'un autre fichier Access. Avec l'interface graphique il n'y a pas beaucoup plus simple mais ce que je cherche c'est du code qui pourait automatiser la chose.
Je crois pas qu'il soit possible de délier des table mais si je trouve du code pour changer le chemin de liaison, ca me convient aussi.

Je vous remercie d'avance.
Configuration: Windows XP
Internet Explorer 6.0
Office2003
Répondre à _goni  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le jeudi 21 décembre 2006 à 13:46:21
Salut,

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
Next
Pour 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 !)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le jeudi 21 décembre 2006 à 14:17:15
Bon ben, il faut déjà que je progresse en programation avant de pouvoir mettre en oeuvre un truc comme ça. Je continue à essayer.
Répondre à _goni

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le vendredi 22 décembre 2006 à 09:37:18
Au fait, je n'ai même pas dis merci donc merci beaucoup blux
Répondre à _goni

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le vendredi 22 décembre 2006 à 09:40:11
Tu diras merci quand ça marchera ! ;-)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le vendredi 22 décembre 2006 à 09:45:06
Salut blux,

le code que tu as écrit vaut un petit merci quand même :-)) lami20j
Répondre à lami20j

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le vendredi 22 décembre 2006 à 10:03:24
Bon ben, si t'insistes...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mardi 26 décembre 2006 à 14:07:48
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
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
Répondre à _goni

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 08:21:27
Ben moi non plus, car ta procédure semble créer des tables :
        CurrentDb.TableDefs.Append TableCree
Ca me parait donc normal qu'il te jette si une table existe déjà...

J'ai pas tout compris l'objet du code...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 10:56:35
J'ai mis en place le code que tu m'as donné. Ca donne :

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
Répondre à _goni

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 12:25:54
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...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 13:40:17
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 <> "" Then
Si je l'enlève, j'ai une erreur. As tu une idée ?
Répondre à _goni

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 14:49:58
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...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 15:20:41
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
Répondre à _goni

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 15:30:04
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é...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 15:47:45
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
Répondre à _goni

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 16:06:01
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 ?
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 16:18:48
voila mon code :
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...
Répondre à _goni

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 16:29:05
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
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 16:54:22
Alors je me trouve face à une nouvelle erreur.
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 
Répondre à _goni

20


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 16:55:51
petite précision, je n'ai pas le droit de supprimer ce petit espace qui doit etre la raison de cet erreur.
Répondre à _goni

21


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 16:58:43
Je viens de me rendre compte aussi que le chemin change cette fois-ci. Donc plus qu'a savoir d'où vient cet erreur
Répondre à _goni

22


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 17:03:01
Ton erreur est en quelle ligne ?

As-tu fait les modifs suggérées en 18 ?
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

23


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 17:06:56
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
Répondre à _goni

24


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
_goni, le mercredi 27 décembre 2006 à 17:10:34
alors c'est au niveau du premier passage sur la ligne TableData.RefreshLink
Répondre à _goni

25


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mercredi 27 décembre 2006 à 17:29:22
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 !
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

26


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 _goni, le mercredi 17 janvier 2007 à 17:47:36
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 :
'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.
N’oubliez pas de cocher la case quand le problème est résolu
Répondre à _goni
Aide pour créer requêtes ACCESS (Résolu) Bonjour à tous , J'ai créé une BD Access avec 2 tables : TABLE1 : ENTREE N° DATE REF-E PRODUIT QTE-E TABLE2 : SORTIE N° DATE REF-S PRODUIT QTE-S Ces 2 table sont liées par une relation 1 ENTREE....+sieurs SORTIE Je souhaiterais par une requête... www.commentcamarche.net/forum/affich-2453170-aide-pour-creer-requetes-access
Macro access: ouverture d'un formulaire (Résolu) Bonjour j'ai besoin de votre aide. J'ai un fichier Access avec une table Institution qui contient différentes institutions.Le premier champ est un numéro, le deuxième le nom de l'institution, etc J'ai créé un formulaire Institution... www.commentcamarche.net/forum/affich-1738613-macro-access-ouverture-d-un-formulaire
Cellule excel vers cellule access (Résolu) bonjour, je souhaite recuper la donnee d'une cellule excel et la mettre dans une cellule access d'une table comment puis-je faire? merci de m'aider. toubiiiiiiiiiiiiloooooooooooooouuuuuuuuuuuuuuuuuuuuuupppp www.commentcamarche.net/forum/affich-1249409-cellule-excel-vers-cellule-access
Import / export de données IngresIngres permet d'exporter les données d'une installation Ingres vers une autre (quels que soient l'OS cible ou source) par les commandes : unloaddb copydb Ce qui change entre ces 2 commandes c'est leur périmètre : unloaddb concerne tous... www.commentcamarche.net/faq/sujet-5470-import-export-de-donnees-ingres
Requête Etat Formulaire Access 2007 HELP (Résolu)Bonjour, Voilà mon souci : j'ai créé une BDD access avec plusieurs tables, ce sont des fournisseurs, des produits, des prix, des unités de vente.... Je souhaite obtenir un état pour chaque article, du prix que propose chacun des fournisseurs.... www.commentcamarche.net/forum/affich-6510525-requete-etat-formulaire-access-2007-help
Petits projets réalisé avec ms-access (Résolu)Bonjour, je veux avoir juste des petits examples de projets réalisés avec l'application microsoft Access.Construction des tables, des formulaires, utilisations de quelques requêttes et impression de quelques etats de sortie. Et si c'est... www.commentcamarche.net/forum/affich-3904028-petits-projets-realise-avec-ms-access
Alternative aux triggers sous access (Résolu)Bonjour, j'ai un petit souci que je n'arrive pas à résoudre et qui me bloque. En fait, j'ai une base de données access avec plusieurs tables: desc(numdesc, indic,...) geo(numgeo,nom,...) valeur(numdesc#,numgeo#,valeur,année) la valeur... www.commentcamarche.net/forum/affich-2662094-alternative-aux-triggers-sous-access
SQL - JointuresExpression des jointures Une jointure (ou θ-jointure) est un produit cartésien de deux tables. On appelle équijointure une θ-jointure dont la qualification est une égalité entre deux colonnes. En SQL, l'expression d'une jointure se... www.commentcamarche.net/contents/sql/sqljoint.php3
Les accesseurs et les mutateurs en langage C++La protection des données membres L'un des aspects les plus essentiels du concept « orienté objet » est l'encapsulation, qui consiste à définir des étiquettes pour les données membres et les fonctions membres afin de préciser si celles-ci sont... www.commentcamarche.net/contents/cpp/cppacces.php3
PHP - Parser du XMLIntroduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de... www.commentcamarche.net/contents/php/phpxml.php3