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 :

[Système]Lier automatiquement certaines tables


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut [Système]Lier automatiquement certaines tables
    Bonsoir,

    Mettant à jour régulierement une base de données sur différents postes je dois à chaque fois lier 54 tables dont 11 tables vers une base et les autres tables vers une autres bases. Sachant que je fais ces liaisons bien 2 fois par semaines (sur 13 interfaces) ce qui représente 1404 tables à lier par semaines.

    Je me rends compte que celà représente beaucoup sans compter les risques d'erreur et surtout la non possibilité pour une personne ne connaissant pas access de réaliser des liaisons.

    Pour celà j'aimerais savoir si il était possible grâce à VBA (pourquoi pas dans une base dédiée) de selectionner d'une façon ergonomique les tables à liéer vers des bases dorsales choisies. A la manière d'un explorateur de fichier précisant l'endroit où se trouve les bases dorsales.

    Celà est il réalisable ? Pouvez vous me mettre sur la voie ??

    Cordialement,

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Voici un code que j'utilise

    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
    Public Sub LiaisonTable()
    '---------------------------------------------------------------------------------------
    ' Procedure : LiaisonTable
    ' DateTime  : 04/03/2007 07:04
    ' Author    : STAREC
    ' Purpose   : Cette procédure va permettre de crée la liaison entre la base dorsale et la
    '             base frontale
    '---------------------------------------------------------------------------------------
    '
        Call RecupChemin ' récupération du chemin de la base dorsale
        Set dbf = CurrentDb
        dbf.TableDefs.Refresh
        Dim rst As DAO.Recordset
        strSql = "SELECT strTable FROM tbl_TableAConnecter;"
        Set rst = dbf.OpenRecordset(strSql)
        While Not rst.EOF
            ' suppression de la table
            On Error Resume Next
            DoCmd.RunSQL "DROP TABLE [" & rst("strTable") & "] ;"
            ' création de la liaisons
            DoCmd.TransferDatabase acLink, "Microsoft Access", strChemBaseDorsal, acTable, rst("strTable"), rst("strTable")
            rst.MoveNext
        Wend
        rst.Close
        Set rst = Nothing
    End Sub
    J'ai une table dans ma base (tbl_TableAConnecter) où j'ai le nom des tables.
    Dans strChemBaseDorsal j'ai le chemin de la base où sont les tables.

    Si ce code peut t'inspirer

    Starec

  3. #3
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Normalement, si tu possèdes une DB avec les bonnes liaisons, lors de la copie de cette DB, les liaisons restent.

    Perso, tous les postes ont les mêmes lettres pour les drives réseau.

    Ce qui fait que je ne dois rien changer, si je n'interviens pas sur la dorsale, je fais juste une copie de la frontale avec un fichier bat.

    Et de ce fait, mais liaisons restent correctes.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 238
    Points : 236
    Points
    236
    Par défaut
    Bonjour,

    Après plusieurs mois consacrés à du développement sur d'autres projets, je reviens (enfin) à Access et dans le forum.

    Pour répondre à la demande de mooh91, voici un code que j'utilise dans mes applications pour permettre à l'utilisateur de choisir la base sur laquelle il va travailler. La procédure prévoit d'intégrer un mot de passe si on le souhaite. Elle ouvre une fenêtre Windows classique qui permet de parcourir le chemin.

    Le code est dans un module nommé ChoixChemin ; j'indique le nom de l'application en tête du module avec conNomApp pour personnaliser la message box. J'appelle le module avec un bouton dans le formulaire.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    Option Compare Database
    Option Explicit
    Const conNomApp = "Nom de l'application"
     
     
    Public Sub ChoisirBase_Click()
     
    'Détruire les liaisons vers les tables de la base contenant les données, ouvir une boîte de dialogue
    'pour sélectionner une base de données, puis créer les liaisons des tables
     
    Dim strMotPasse As String
    Dim strCheminBd 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
    Dim fd As FileDialog
    Dim Title As String
    Dim FileDialogSelectedItems As String
    Dim Reponse As Byte
    Dim Cancel As Byte
     
    'Sélection d'une base
     
    'Ouvrir une boîte de dialogue pour sélectionner une base
    Set fd = Application.FileDialog(msoFileDialogOpen)
     
    'Déclarer une variable pour contenir le chemin
    'de chaque objet sélectionné. Même si le chemin est une chaîne (String),
    'la variable doit être Variant parce que la routine For Each ... Next
    'fonctionne uniquement avec Variants et Objects.
    Dim vrtSelectedItem As Variant
     
    choix:
    'Utiliser un bloc With...End With  pour référencer l'objet FileDialog.
    With fd
     
    'Utiliser la méthode Show pour afficher la boîte de dialogue de sélection de fichier
    'et retourner l'action de l'utilisateur.
     
    'L'utilisateur a cliqué sur le bouton d'action, affichage de la boite de dialogue
    .Title = "Choisissez la base contenant les données à utiliser" 'personnalise le titre de la boite de dialogue
    If .Show = -1 Then
     
    'L'utilisateur a cliqué sur Annuler
        If Cancel = True Then
        Exit Sub
        Else
            'Destruction des anciennes liaisons des tables
            Dim BD As DAO.Database
            Set BD = CurrentDb
            Dim tb As DAO.TableDef
            Dim Sauv As String
            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
        End If
     
    'Vérifier toutes les chaînes dans la collection FileDialogSelectedItems
    For Each vrtSelectedItem In .SelectedItems
     
    'vrtSelectedItem est une chaîne qui contient le chemin de chaque objet sélectionné
    'Création d'une message box qui affiche le chemin sélectionné
     
    Reponse = MsgBox("La base sélectionnée est : " & vrtSelectedItem, vbOKOnly, conNomApp)
        If Reponse = 7 Then
        GoTo choix
        End If
     
    FileDialogSelectedItems = vrtSelectedItem
     
    Next vrtSelectedItem
     
    'L'utilisateur clique sur annuler
    Else
    End If
     
    End With
     
    'Création des nouvelles liaisons des tables
     
    'Définir mot passe et chemin base de données
    strMotPasse = "pass"
    strCheminBd = FileDialogSelectedItems
        If IsNull(strCheminBd) Or strCheminBd = "" Then
        Exit Sub
        End If
     
    'Définir la chaine de connexion permettant la liaison des tables
    strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=" & strCheminBd
    'Instancie l'objet Database de la base courante
    Set oDb = CurrentDb
    'Instancie l'objet Database de la base protégée
    Set oDbSource = DBEngine.OpenDatabase(strCheminBd, True, True, strConnect)
     
    'Parcours l'ensemble des tables de la base de données protégée
    'et stocke leur nom
    For Each oTblSource In oDbSource.TableDefs
        'ignore les tables system
        If (oTblSource.Attributes And dbSystemObject) = 0 Then
            strTemp = strTemp & oTblSource.Name & "|"
        End If
    Next
     
    'Ferme la base de données sources (impératif pour la liaison)
    oDbSource.Close: Set oDbSource = Nothing
    'parcours le tableau de noms de tables
    strNomsTables = Split(Left(strTemp, Len(strTemp) - 1), "|")
    For i = 0 To UBound(strNomsTables)
    'Crée une nouvelle table dans la base de données courante
    Set oTbl = oDb.CreateTableDef(strNomsTables(i))
    'Lie les deux tables
    oTbl.Connect = strConnect
    oTbl.SourceTableName = strNomsTables(i)
    'Ajoute la table à la base de données
    oDb.TableDefs.Append oTbl
    Next i
     
    'Rafraîchit la liste des tables
    oDb.TableDefs.Refresh
     
    End Sub
    Appel du module par un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub ChoixBase_Click()
    Call ChoixChemin.ChoisirBase_Click
    End Sub
    Ce code ne nécessite aucune modification à part le nom de l'application dans conNomApp.

    Cela devrait simplifier tes mises à jour régulières.

    Bonne journée.

    javelot69

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup à vous tous pour vos codes.
    Pour répondre à Heureux-OLi je suis d'accord avec toi sur la conservation des liaisons lors de copie. J'utilise cette méthode sur les postes travaillant sur la même dorsale.

    Cependant certains services travaillent sur leur propre dorsale d'où la modification des liaisons à faire pour chaque service abordé.

    Je teste les codes que vous m'avez communiqué et vous donnes des nouvelles.

    Merci encore,

    Cordialement,

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Suppeerrrr!!

    Alors j'ai opté pour le code de Starec. Cependant en fignolant j'ai inclus la possibilité de préciser un chemin d'accès en cliquant sur un bouton parcourir et celà en me passant de commondialog référence à ajouter obligatoirement pour que le code de Javelot69 fonctionne.

    En gros j'ai le même résultat que la code de Javelot sans la gestion du mot de passe et avec un code un peu plus simple quand même.

    Merci à vous trois !!

    Cordialement,

    NB: d'après mes tests Javelot69, sa serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub ChoixBase_Click() 
    Call ChoisirBase_Click 
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Probleme pour lier automatiquement table access
    Par benjamin002 dans le forum VBA Access
    Réponses: 9
    Dernier message: 17/03/2010, 16h35
  2. [AC-2003] Code permettant de lier automatiquement des tables
    Par benjamin002 dans le forum VBA Access
    Réponses: 1
    Dernier message: 19/02/2010, 16h27
  3. Lier automatiquement Table Access
    Par hilo_31 dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/06/2007, 14h44
  4. lier automatiquement les tables
    Par mnssylvain dans le forum Access
    Réponses: 18
    Dernier message: 28/01/2007, 11h38
  5. création automatique de table avec createdb??
    Par champion dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/09/2004, 10h01

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