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 :

[Access 2000] Modification lien ODBC


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut [Access 2000] Modification lien ODBC
    Bonjour,
    Je suis confronté à un problème que je n'arrive pas à résoudre ...

    Au boulot, on me demande d'attaquer une Base. J'ai mes identifiants et le DSN nécessaires à la connection pour lier la table sous Access. En bref, tout ce qu'il faut pour créer mon lien ODBC

    Le problème est le suivant :
    Le nom de la base (le DSN) à attaquer va changer tous les mois

    Ce que je voudrais faire, modifier mon lien ODBC via VBA afin que malgré le changement de nom de la base, toutes les requêtes et tables restent accessibles sans avoir à aller modifier le lien ODBC ni réimporter les tables..

    L'application va ensuite être fourni aux utilisateurs, et je ne peux pas leur expliquer comment changer un lien ODBC... Trop de source de problème

    Le nom de la base change tous les mois car c'est en fait une sauvegarde du mois en cours. Son nom est généré automatiquement selon un formalisme bien précis....ex : nom_mois_annee

    Quelqu'un aurait-il déjà réussi à faire cela ?

    En vous remerciant à l'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 642
    Points : 34 349
    Points
    34 349
    Par défaut
    Salut,
    j'ai ceci à te proposer :
    (désolé bcp de lignes, j'ai utilisé ca durant le T4 2007 )

    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    Function MajLienODBC(PathBaseAModifier As String, TitreTableAModifier As String, connect As String, TitreTableSource As String) As Boolean
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim temp As Boolean
    Dim tables As DAO.TableDef
    Dim relation As DAO.relation
    Dim rel As DAO.relation
    Dim chp As DAO.Field
    Dim a As DAO.Property
     
     
        MajLienODBC = False
        temp = False
        Debug.Print PathBaseAModifier
        ' Ouverture de la base de données
        Set db = DBEngine.OpenDatabase(PathBaseAModifier)
        For Each tables In db.TableDefs
            If tables.Name = TitreTableAModifier Then
                temp = True
                Exit For
            End If
        Next
     
        ' Création d'un nouvel objet TableDef.
        Set tbl = db.CreateTableDef(TitreTableAModifier & "_piou", dbAttachSavePWD)
        ' Définition des propriétés pour créer le lien
      Debug.Print tbl.Name & ":" & connect
         tbl.connect = "ODBC;" & connect
       ' tbl.RefreshLink
        tbl.SourceTableName = TitreTableSource
        'Ajout de la nouvelle table
        db.TableDefs.Append tbl
        db.TableDefs.Refresh
     
        If temp Then
            'Création des relations identiques à l'ancienne table
            For Each relation In db.Relations
                If relation.table = TitreTableAModifier Then
                    Set rel = db.CreateRelation(tbl.Name & relation.ForeignTable, tbl.Name, relation.ForeignTable)
                    rel.Attributes = relation.Attributes
                    Set chp = rel.CreateField(relation.Fields(0).Name) ' Fournit le nom du champ clé externe.
                    chp.ForeignName = relation.Fields(0).ForeignName
                    rel.Fields.Append chp
                    db.Relations.Append rel
                    db.Relations.Refresh
                End If
                If relation.ForeignTable = TitreTableAModifier Then
                    Set rel = db.CreateRelation(relation.table & tbl.Name, relation.table, tbl.Name)
                    rel.Attributes = relation.Attributes
                    Set chp = rel.CreateField(relation.Fields(0).Name) ' Fournit le nom du champ clé externe.
                    chp.ForeignName = relation.Fields(0).ForeignName
                    rel.Fields.Append chp
                    'Debug.Print rel.Name
                    db.Relations.Append rel
                End If
            Next
            'Suppression des relations de l'ancienne table
            For Each relation In db.Relations
                If relation.table = TitreTableAModifier Or relation.ForeignTable = TitreTableAModifier Then
                    db.Relations.Delete relation.Name
                End If
            Next
            'Suppression de l'ancienne table
            db.TableDefs.Delete TitreTableAModifier
            'Renommage de la nouvelle table
            db.TableDefs(TitreTableAModifier & "_piou").Name = TitreTableAModifier
            ' Renommage des relations sans le _piou
            'For Each relation In db.Relations
            '    If Replace(relation.Name, "_piou", "") <> relation.Name Then
            '        Set rel = db.CreateRelation(Replace(relation.Name, "_piou", ""), Replace(relation.table, "_piou", ""), Replace(relation.ForeignTable, "_piou", ""))
            '        rel.Attributes = relation.Attributes
            '        Set chp = rel.CreateField(relation.Fields(0).Name) ' Fournit le nom du champ clé externe.
            '        chp.ForeignName = relation.Fields(0).ForeignName
            '        rel.Fields.Append chp
            '        'Debug.Print rel.Name
            '        db.Relations.Delete relation.Name
            '        db.Relations.Append rel
            '        db.Relations.Refresh
            '    End If
            'Next
            'Debug.Print db.TableDefs(TitreTableAModifier).connect
            db.TableDefs(TitreTableAModifier).connect = "ODBC;" & connect
            db.TableDefs(TitreTableAModifier).RefreshLink
            Debug.Print db.TableDefs(TitreTableAModifier).connect
            MajLienODBC = True
        End If
     
        db.Close
        Exit Function
    fin:
     
    End Function
     
    Function MajTableliee(PathBaseAModifier As String, TitreTableAModifier As String, pathlien As String, TitreTableSource As String) As Boolean
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim temp As Boolean
    Dim tables As DAO.TableDef
    Dim relation As DAO.relation
    Dim rel As DAO.relation
    Dim chp As DAO.Field
    Dim a As DAO.Property
        If pathlien <> "a_faire" Then
        MajTableliee = False
        temp = False
        ' Ouverture de la base de données
        Set db = DBEngine.OpenDatabase(PathBaseAModifier)
        For Each tables In db.TableDefs
            If tables.Name = TitreTableAModifier Then
                temp = True
                Exit For
            End If
        Next
     
        ' Création d'un nouvel objet TableDef.
        Set tbl = db.CreateTableDef(TitreTableAModifier & "_piou")
        ' Définition des propriétés pour créer le lien
        tbl.connect = "MS ACCESS;DATABASE=" & pathlien
        tbl.SourceTableName = TitreTableSource
        'Ajout de la nouvelle table
        Debug.Print PathBaseAModifier
        Debug.Print pathlien
        db.TableDefs.Append tbl
        db.TableDefs.Refresh
        If temp Then
            'Création des relations identiques à l'ancienne table
            For Each relation In db.Relations
                If relation.table = TitreTableAModifier Then
                    Set rel = db.CreateRelation(tbl.Name & relation.ForeignTable, tbl.Name, relation.ForeignTable)
                    rel.Attributes = relation.Attributes
                    Set chp = rel.CreateField(relation.Fields(0).Name) ' Fournit le nom du champ clé externe.
                    chp.ForeignName = relation.Fields(0).ForeignName
                    rel.Fields.Append chp
                    db.Relations.Append rel
                    db.Relations.Refresh
                End If
                If relation.ForeignTable = TitreTableAModifier Then
                    Set rel = db.CreateRelation(relation.table & tbl.Name, relation.table, tbl.Name)
                    rel.Attributes = relation.Attributes
                    Set chp = rel.CreateField(relation.Fields(0).Name) ' Fournit le nom du champ clé externe.
                    chp.ForeignName = relation.Fields(0).ForeignName
                    rel.Fields.Append chp
                    'Debug.Print rel.Name
                    db.Relations.Append rel
                End If
            Next
            'Suppression des relations de l'ancienne table
            For Each relation In db.Relations
                If relation.table = TitreTableAModifier Or relation.ForeignTable = TitreTableAModifier Then
                    db.Relations.Delete relation.Name
                End If
            Next
            'Suppression de l'ancienne table
            db.TableDefs.Delete TitreTableAModifier
            'db.TableDefs.Delete TitreTableAModifier & "_piou"
            'Renommage de la nouvelle table
            db.TableDefs(TitreTableAModifier & "_piou").Name = TitreTableAModifier
            ' Renommage des relations sans le _piou
            'For Each relation In db.Relations
            '    If Replace(relation.Name, "_piou", "") <> relation.Name Then
            '        Debug.Print relation.Name
            '        Set rel = db.CreateRelation(Replace(relation.Name, "_piou", ""), Replace(relation.table, "_piou", ""), Replace(relation.ForeignTable, "_piou", ""), relation.Attributes)
            '        'rel.Attributes = relation.Attributes
            '        Set chp = rel.CreateField(relation.Fields(0).Name) ' Fournit le nom du champ clé externe.
            '        chp.ForeignName = relation.Fields(0).ForeignName
            '        rel.Fields.Append chp
            '        'Debug.Print rel.Name
            '        db.Relations.Delete relation.Name
            '        db.Relations.Append rel
            '        db.Relations.Refresh
            '    End If
            'Next
     
            MajTableliee = True
        End If
        db.Close
        Exit Function
    Else
        MajTableliee = True
    End If
     
    End Function
    appels de fonctions comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MajLienODBC "Pathbase","NomTableARelier","NouveauConnectODBC","NomForeignTable"
    à adapter j'en suis certain

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut
    Effectivement beaucoup de lignes
    Je me demande si çà répond bien à ma question en plus... Pas sûr non pluq d'avoir poser la bonne question

    Je vais attendre d'obtenir mon accès, créer mon lien ODBC et voir après ce qu'il me faut vraiment
    J'ai l'impression que le lien ODBC sera toujours le même mais sous ce même lien, il y aura plusieurs bases et ce sont ces bases qui changeront de noms et qui me feront redéfinir mes liaisons de table

    Je reviens sur le forum quand ma demande sera plus définie

    En tout cas merci de ta réponse, çà va quand même me donner un sacré coup de pouce

Discussions similaires

  1. [SQL SRV 2000] lien ODBC access (#supprimé)
    Par jibjib dans le forum Administration
    Réponses: 3
    Dernier message: 09/06/2009, 10h02
  2. Lien ODBC [AS400 Db2 - Access 2000]
    Par med1 dans le forum Access
    Réponses: 2
    Dernier message: 03/07/2008, 08h08
  3. ODBC SAGE 500 V-ISAM et Access 2000
    Par Alex974 dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 14/09/2006, 13h38
  4. Lien ODBC oracle pour access
    Par christellel198 dans le forum Oracle
    Réponses: 7
    Dernier message: 29/09/2005, 11h43
  5. ACCESS modif lien tables attachées
    Par Berched dans le forum Access
    Réponses: 4
    Dernier message: 23/06/2005, 12h08

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