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 :

Importer ou créer les relations entre les tables.


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut Importer ou créer les relations entre les tables.
    Bonjour,
    J'ai besoin d'importer une base de données répliquée dans une base non répliquée, j'ai déjà crée les requêtes de création des tables (à partir des tables répliquées) et je cherche maintenant un moyen simple de créer ou d'importer les relations (avec intégrité référentielle ou non suivants les liens).
    Savez vous s'il est possible et comment importer/créer avec du code VBA les relations entre les tables pour ne pas avoir à les refaire à chaque fois à la main vu le nombre élevé de tables.
    Je vous en remercie d'avance, bonne journée !

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Oui tu peux le faire en utilisant la collection Relations de CurrentDB.

    Tu peux aussi dérépliquer une BD en utilisant :TSI 2000 Access Un-Replictor (Attention il n'est pas parfait).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    D'accord merci beaucoup

  4. #4
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    tu peux aussi le faire par du SQL (CurrentDB.Execute) ...

    ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY / PRIMARY KEY ... REFERENCE
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Et y a-t-il un moyen d'exporter les relations en VBA... du moins de générer automatiquement le code en fonction des relations ? Car j'ai beaucoup de tables et de relations et si je el fais à tout à la mains ça risque de prendre beaucoup de temps, merci.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Avec la collection Relations citée plus haut tu peux faire cela. Avec un peu de VBA tu peux parcourir tes relations actuelles les mémoriser dans une table puis te servir de cette table pour les recréer.

    Voit l'aide de Access pour les détails.

    le code là :

    http://www.utteraccess.com/forums/sh...b=5&o=&fpart=1

    semble faire cela.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    J'avais tenté quelque chose qui n'a pas marché: faire des requêtes de création des tables à partir des tables répliquée en enlevant pour chaque table els champs liés à la réplication. Ensuite j'importais les données dans une autre base ou j'avais auparavant importé la structure des tables non répliquée ou j'avais recrée les relations à la main.

    Le problème c'est que lors de l'export de la structure (définition des tables) des tables access ne conserve pas toutes les données de la tables.
    Par exemple les valeur par défaut des champs et le fait qu'un champs soit indexé ou non n'a pas été exporté.

    J'ai trouvé ce code sur internet pour importer une base mais ça ne supprime pas les données relatives à la réplication :

    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
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    Public Function Clonage(myoldpath As String, myoldname As String)
     
    Dim DaoDB As DAO.Database
    Dim oTable As DAO.TableDef
    Dim oQuery As DAO.QueryDef
    Dim oForm As Object
    Dim oReport As Object
    Dim oMacro As Object
    Dim oModule As Object
    Dim oref As Object
    Dim oOldRef As Object
    Dim Bfound As Boolean
    Dim ThisRel As DAO.Relation
    Dim ThisField As DAO.Field
    Dim Cr As String, i As Integer, cnt As Integer
    Dim j As Integer
     
    'Instance pour la nouvelle base
    Dim MyNewAccess As Access.Application
    'Instance pour l'ancienne base
    Dim MyOldAccess As Access.Application
     
    'Création de la nouvelle base via DAO
    Set DaoDB = DAO.DBEngine.CreateDatabase(myoldpath & "Temp.mdb", dbLangGeneral)
    'Fermeture de la session DAO
    DaoDB.Close
    Set DaoDB = Nothing
     
    Set MyNewAccess = New Access.Application
    Set MyOldAccess = New Access.Application
     
    With MyNewAccess
     
    'Ouverture de la nouvelle base dans une instance
    .OpenCurrentDatabase (myoldpath & "Temp.mdb")
     
    'Ouverture de l'ancienne base dans une autre instance
    MyOldAccess.OpenCurrentDatabase (myoldpath & myoldname)
     
    'On importe dans la nouvelle base toutes les tables sauf
    'les tables système
    For Each oTable In MyOldAccess.CurrentDb.TableDefs
    If (oTable.Attributes And DAO.dbSystemObject) = False Then
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acTable, oTable.Name, oTable.Name
    End If
    Next oTable
     
    'On importe dans la nouvelle base toutes les requêtes
    For Each oQuery In MyOldAccess.CurrentDb.QueryDefs
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acQuery, oQuery.Name, oQuery.Name
    Next oQuery
     
    'On importe dans la nouvelle base tous les formulaires
    For Each oForm In MyOldAccess.CurrentProject.AllForms
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acForm, oForm.Name, oForm.Name
    Next oForm
     
    'On importe dans la nouvelle base tous les états
    For Each oReport In MyOldAccess.CurrentProject.AllReports
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acReport, oReport.Name, oReport.Name
    Next oReport
     
    'On importe dans la nouvelle base toutes les macros
    For Each oMacro In MyOldAccess.CurrentProject.AllMacros
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acMacro, oMacro.Name, oMacro.Name
    Next oMacro
     
    'On importe dans la nouvelle base tous les modules
    For Each oModule In MyOldAccess.CurrentProject.AllModules
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acModule, oModule.Name, oModule.Name
    Next oModule
     
    'Appel de la procédure d'effacement des références dans
    'la nouvelle base
    DeleteRefs MyNewAccess
     
    ' Parcours de toutes les références de l'ancienne base et ajout
    'des absentes dans la nouvelle base
    For Each oOldRef In MyOldAccess.References
    For Each oref In MyNewAccess.References
    If oref.FullPath = oOldRef.FullPath Then
    Bfound = True
    Exit For
    Else
    Bfound = False
    End If
    Next oref
    If Bfound = False Then
    .References.AddFromFile oOldRef.FullPath
    End If
    Next oOldRef
     
    'On importe les tables comportant les spécifications
    ' d'importation/exportation
     
    On Error GoTo Err_Vide
     
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acTable, "MSysIMEXColumns", "MSysIMEXColumns"
    .DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
    & myoldname, acTable, "MSysIMEXSpecs", "MSysIMEXSpecs"
     
     
    'On importe toutes les relations entre les tables
    ' Parcours de toutes les références de l'ancienne base
    For i = 0 To MyOldAccess.CurrentDb.Relations.Count - 1
     
    ' Creation de 'ThisRel' avec les valeurs de 'ThatRel'.
    Set ThisRel = MyNewAccess.CurrentDb.CreateRelation _
    (MyOldAccess.CurrentDb.Relations(i).Name, _
    MyOldAccess.CurrentDb.Relations(i).Table, _
    MyOldAccess.CurrentDb.Relations(i).ForeignTable, _
    MyOldAccess.CurrentDb.Relations(i).Attributes)
     
    ' Parcours des champs de la relation
    For j = 0 To MyOldAccess.CurrentDb.Relations(i).Fields.Count - 1
     
    ' Creation de 'ThisField' avec les valeurs de 'ThatField'.
    Set ThisField = ThisRel.CreateField _
    (MyOldAccess.CurrentDb.Relations(i).Fields(j).Name)
    ThisField.ForeignName = _
    MyOldAccess.CurrentDb.Relations(i).Fields(j).ForeignName
    ThisRel.Fields.Append ThisField
     
    Next j
     
    MyNewAccess.CurrentDb.Relations.Append ThisRel
     
    Next i
     
    'Fermeture de l'instance s'occupant de la nouvelle base
    .Application.Quit
     
    ' Fermeture de l'instance s'occupant de l'ancienne base
    MyOldAccess.Application.Quit
     
    End With
     
    Set MyNewAccess = Nothing
    Set MyOldAccess = Nothing
     
    MsgBox "Done"
     
    'Si la table spécifiée n'existe pas, on passe
    Err_Vide:
    If Err.Number = 3011 Then
    Resume Next
    End If
     
    End Function
     
    Public Sub DeleteRefs(MyNewAccess As Access.Application)
     
    Dim oref As Object
     
    On Error GoTo Err_Traitement
    'Effacement de toutes les références
    For Each oref In MyNewAccess.References
    MyNewAccess.References.Remove oref
    Next oref
    Exit Sub
     
    'Si l'erreur "Vous ne pouvez pas enlever une référence par défaut..."
    'apparaît, on sort de la boucle
     
    Err_Traitement:
    If Err.Number = 57101 Then
    Resume Next
    Else
    MsgBox Err.Description, vbCritical
    End If
    End Sub
     
     
    Public Function Replace(myoldpath, myoldname)
     
    ' On copie l'ancienne base en "Corrupted.old" et on l'efface
    FileCopy myoldpath & myoldname, myoldpath & "Corrupted.old"
    Kill myoldpath & myoldname
     
    ' On copie la nouvelle base sous le nom de l'ancienne et on efface
    'la Temp.mdb
    FileCopy myoldpath & "Temp.mdb", myoldpath & myoldname
    Kill myoldpath & "Temp.mdb"
     
    End Function

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    J'ai utilisé le script présent sur
    http://www.utteraccess.com/forums/sh...b=5&o=&fpart=1 qui importe tout les éléments d'une base access mais le script de création de table donne ceci:

    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
    CurrentProject.Connection.Execute "CREATE TABLE [employees]([employeeid] LONG IDENTITY(1,1)  , " & _ 
    		"[lastname] VARCHAR(20)  NOT NULL  , " & _ 
    		"[firstname] VARCHAR(10)  NOT NULL  , " & _ 
    		"[title] VARCHAR(30)  , " & _ 
    		"[titleofcourtesy] VARCHAR(25)  , " & _ 
    		"[birthdate] DATETIME  , " & _ 
    		"[hiredate] DATETIME  , " & _ 
    		"[address] VARCHAR(60)  , " & _ 
    		"[city] VARCHAR(15)  , " & _ 
    		"[region] VARCHAR(15)  , " & _ 
    		"[postalcode] VARCHAR(10)  , " & _ 
    		"[country] VARCHAR(15)  , " & _ 
    		"[homephone] VARCHAR(24)  , " & _ 
    		"[extension] VARCHAR(4)  , " & _ 
    		"[photo] VARCHAR(255)  , " & _ 
    		"[notes] LONGTEXT  , " & _ 
    		"[reportsto] LONG   , PRIMARY KEY ( [Employeeid]))
    et il est inexploitable à cause d'une erreur de syntaxe. Je suis sous ACCESS 2000 et cette syntaxe ne passe pas du tout.

    J'ai donc essayé de modifier le script pour obtenir une syntaxe correct qui donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim str As String
            str = str & "[s_generation] LONG  , "
            str = str & "[s_lineage] IMAGE  , "
            str = str & "[s_guid] GUID  DEFAULT GenGUID( , "
            str = str & "[id_champ] VARCHAR(50)  , "
            str = str & "[lib_champ] VARCHAR(50)  , "
            str = str & "[id_etat] LONG  DEFAULT 0 "
            CurrentProject.Connection.Execute "CREATE TABLE [ressources_champ_](" & str & " , PRIMARY KEY ( [Lib_champ]))"
    J'ai plus de souci dans ACCESS en faisant comme cela, la syntaxe semble valide mais à l'éxécution de la requête il y a encore un souci.

    Quelqu'un pourrait il m'aider à corriger la synatxe ?

Discussions similaires

  1. créer les relations entre les tables
    Par Msysteme dans le forum Développement
    Réponses: 3
    Dernier message: 24/12/2008, 09h01
  2. Récupérer les relations entre les tables d'une bdd
    Par FRED.G dans le forum Accès aux données
    Réponses: 1
    Dernier message: 16/01/2007, 13h07
  3. Créer et effacer les relations entre les tables en VB
    Par polianita dans le forum Access
    Réponses: 7
    Dernier message: 04/08/2006, 11h54
  4. Pourquoi les relations entre les tables
    Par ghita269 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/12/2005, 11h54
  5. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07

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