IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Mise à jour du chemin d'une table liée [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut Mise à jour du chemin d'une table liée
    Bonjour,



    Après des recherche sur le net, ce code devrait mettre à jour le chemin de ma table liée "T-Test"... mais ça ne marche pas... le chemin ne change pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.TableDefs("T-Test").Connect = ";DATABASE=C:\test.accdb"

    J'utilise Access 2007.

    Help please

    Merci
    Dams'

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 282
    Points : 356
    Points
    356
    Par défaut
    Bonjour,

    As-tu essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\test.accdb", acTable, "T-Test", "T-Test"
    Le premier "T-Test" est le nom de la table dans la DB source et le deuxieme "T-Test" est le nom sous lequel elle sera connue dans ta base locale.

    Bonne chance

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    Essaye de décomposer en passant par des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Set db = CurrentDb
    Set tbl = db.TableDefs("T-Test")
    tbl.Connect = ";DATABASE=C:\test.accdb"
    tbl.RefreshLink

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par SSJconsult Voir le message
    Bonjour,

    As-tu essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\test.accdb", acTable, "T-Test", "T-Test"
    Le premier "T-Test" est le nom de la table dans la DB source et le deuxieme "T-Test" est le nom sous lequel elle sera connue dans ta base locale.

    Bonne chance
    En fait une nouvelle table "T-Test1" est créée avec le nouveau lien... donc ne convient pas

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par fgiambelluco Voir le message
    Bonjour
    Essaye de décomposer en passant par des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Set db = CurrentDb
    Set tbl = db.TableDefs("T-Test")
    tbl.Connect = ";DATABASE=C:\test.accdb"
    tbl.RefreshLink

    ça marche !!!

    Mais je ne comprends pas pourquoi ma version en 1 ligne ne marche pas... c'est la même chose !!! non !!?

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Non

    Currentdb est une fonction et non une propriété.

    Le résultat d'une fonction est à placer dans une variable

    En revanche, ceci aurait fonctionné (à priori) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBEngine(0)(0).TableDefs("T-Test").Connect = ";DATABASE=C:\test.accdb"

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 282
    Points : 356
    Points
    356
    Par défaut
    Il suffit de faire d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.DeleteObject acTable, "T-Test"
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\test.accdb", acTable, "T-Test", "T-Test"

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    Non

    Currentdb est une fonction et non une propriété.

    Le résultat d'une fonction est à placer dans une variable

    En revanche, ceci aurait fonctionné (à priori) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBEngine(0)(0).TableDefs("T-Test").Connect = ";DATABASE=C:\test.accdb"


    exact ... par contre quand je met un espion sur Currentdb et DBEngine(0)(0) il donne exactement les mêmes infos !!

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par SSJconsult Voir le message
    Il suffit de faire d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.DeleteObject acTable, "T-Test"
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\test.accdb", acTable, "T-Test", "T-Test"
    c'est pas mal aussi

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Je fais face à un nouveau soucis...
    les liens s'actualisent bien, par contre j'ai 1 nom de champ qui est modifié et pour un autre un format qui passe de texte à numérique


    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Function MAJ_Tables_liées()
     
        Dim Db As DAO.Database
        Dim Chemin_courant As String
        Dim Nom_Fichier As String
     
        'Base courante
        Set Db = CurrentDb
     
        'Exctration du chemin du dossier de la base
        Chemin_courant = Left(Db.Name, Len(Db.Name) - Len(Dir(Db.Name)))
     
        'Parcourir toutes les tables
        For Each Tb In Db.TableDefs
            'Sélection uniquement des tables liées au format texte
            If Left(Tb.Connect, 5) = "Text;" Then
     
                'Nom du fichier lié sans l'extension
                Nom_Fichier = Left(Tb.SourceTableName, InStrRev((Tb.SourceTableName), ".") - 1)
     
                'Mise à jour de la connexion
                Tb.Connect = "Text;DSN=" & Nom_Fichier & " Spécification d'attache1;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=1252;ACCDB=YES;DATABASE=" & Chemin_courant
                'Met à jour les informations de connexion de la table liée
                Tb.RefreshLink
            End If
        Next
     
    End Function

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Que donne le contenu de

    Tb.Connect

    ?

    Tu lies combien de tables ? Elles ont toutes le même fichier de spécification d'attache ?

    Sachant que la chaine Connect est censée ressembler à :

    Text;DSN=NOMFICHIERSPEC;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=850;ACCDB=YES;DATABASE=CHEMIN;TABLE=NOMTABLE#txt

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    Pour ce faire, tu as le choix entre DAO ou SQL.
    Sachant que j'ai rencontré pas mal de problème pour mettre à jour des champs en dynamique :

    Pour la mise à jour du type de données, j'utilise SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub ModificationTypeChamp()
     
     
        DoCmd.RunSQL ("Alter LaTable clients alter Column LeChamp float")
     
     
    End Sub
     
    'Type alphanumérique CHAR(n) Chaîne de caractères de longueur fixe n (n<16383)
    'Type alphanumérique VARCHAR(n) Chaîne de caractères de n caractères maximum (n<16383)
    'Type numérique NUMBER(n,[d]) Nombre de n chiffres [optionnellement d après la virgule]
    'Type numérique SMALLINT Entier signé de 16 bits (-32768 à 32757)
    'Type numérique INTEGER Entier signé de 32 bits (-2E31 à 2E31-1)
    'Type numérique FLOAT Nombre à virgule flottante
    'Type horaire DATE Date sous la forme 16/07/99
    'Type horaire TIME Heure sous la forme 12:54:24.85
    'Type horaire TIMESTAMP Date et Heure
    pour la modification d'un nom de champ, je n'ai pas eu l'occasion d'en faire, mais tu peux essayer avec DAO (je regarde ce que j'ai de mon coté).

  13. #13
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re
    En fait pour changer le nom d'un champ, c'est tout simple en DAO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim db As DAO.Database
        Dim tbl As DAO.TableDef
        Dim fld As DAO.Field
        Set db = CurrentDb
        Set tbl = db.TableDefs("LATABLE")
        Set fld = tbl.Fields("AncienNom")
        fld.Name = "NouveauNom"


    PS: Dans le code que tu as posté, pourquoi tu n'utilises pas CurrentProject.Path pour le chemin à la base ?

  14. #14
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    A mon avis, il serait préférable de voir pourquoi les sépcifications changent en amont plutôt que de tenter de les retoucher en aval.

    Quant à changer le type d'un champ d'une table liée, j'ai comme dans l'idée que l'ordre SQL va être refusé

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par fgiambelluco Voir le message
    PS: Dans le code que tu as posté, pourquoi tu n'utilises pas CurrentProject.Path pour le chemin à la base ?
    c'est clair c'est tellement plus simple... je croyais que ça marchait qu'avec Excel ... car moi je faisais une fixation sur "currentdb" et là ça n'existe pas... je ne savais pas qu'il y'avais ça aussi : "CurrentProject"

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    A mon avis, il serait préférable de voir pourquoi les sépcifications changent en amont plutôt que de tenter de les retoucher en aval.

    moi aussi et j'ai trouvé :-) le pourquoi, mais n'arrive pas à le corriger...

    en fait le problème vient du fait que : "Spécification d'attache"... un coup ça s'appelle 1 un coup ça s'appelle 2... y'en avait plusieurs qui s'étaient créés lors de mes tests... et du coups il étaient encore en mémoire avec ces quelques différences...


    Par contre dans la table système : MSysObjects, je n'arrive pas à modifier le champ connect pour virer les 1 et les 2 et tout mmetre en "Spécification d'attache"...
    Comment faire ?

  17. #17
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    T'en recrée un nouveau que tu nommes correctement

  18. #18
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    T'en recrée un nouveau que tu nommes correctement
    oui ça j'ai fait... mais il faut l'affecter à ma table et dans "MSysObjects" c'est bloqué en modification

  19. #19
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    Quant à changer le type d'un champ d'une table liée, j'ai comme dans l'idée que l'ordre SQL va être refusé
    Je suis tout à fait d'accord, dans ce cas là, il faut utiliser le OpenDataBase pour ouvrir la base et le QueryDef pour exécuter ma requète SQL.



    PS:En fait, la seule fois où j'ai fait ça, j'ai utilisé l'ADO dans une programme VB de mise à jour d'une base sur un serveur.

  20. #20
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 622
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par fgiambelluco Voir le message
    [...]
    il faut utiliser le OpenDataBase pour ouvrir la base et le QueryDef pour exécuter ma requète SQL.
    Désolé là je suis largué peux-tu être plus précis... mais attention lis ma réponse plus haut je souhaite changer le contenu du champ 'connect' de la table système MSysObjects

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/08/2012, 19h58
  2. Module de mise à jour des champs d'une table
    Par kikaillo dans le forum Access
    Réponses: 14
    Dernier message: 18/04/2006, 09h42
  3. Réponses: 6
    Dernier message: 07/02/2006, 14h44
  4. Vue non mise à jour après modification d'une table
    Par cybernet35 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 13h54
  5. Comment récupérer le chemin d'une table liée
    Par ptitepunk dans le forum Access
    Réponses: 2
    Dernier message: 15/09/2005, 10h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo