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

Access Discussion :

Créer des relations en VBA


Sujet :

Access

  1. #1
    Membre habitué Avatar de Orionmel
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 174
    Points : 185
    Points
    185
    Par défaut Créer des relations en VBA
    Hello world,

    Je suis face à un problème me gachant la vie.

    Voilà, j'ai créé une fonction permettant d'exporter ma base Access dans une autre base Access grâce à la fonction DoCmd.TransferDatabase. Je transfert bien les tables dans le bon ordre mais Access ne copie pas les relations entre les tables.

    Si bien que dans mon fichier exporté, toute requête Access est inutile vu que les relations ne sont pas créées.

    Y'a t il un moyen de copier les relations avec la fonction citée ci-dessus ? Où de les créer grâce à un code vBA ou une macro ?

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Bonjour,

    Une petite recherche sur le forum merci.

  3. #3
    Membre habitué Avatar de Orionmel
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 174
    Points : 185
    Points
    185
    Par défaut
    Oui mais ca j'ai trouvé ^^

    J'ai même trouvé ca :
    http://www.developpez.net/forums/showthread.php?t=3990

    Le problème c'est que ca marche pas, quoi qu'il arrive, mes relations ne se crée pas dans la table erxportée. 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
            Set db = CurrentDb
     
            'création d'un nouveau fichier access
            Set dbBackup = DBEngine.CreateDatabase(txt_path.Value, dbLangGeneral, False)
            dbBackup.Close
     
            unit = 100 / db.TableDefs.Count
     
            'Transfert de toutes les tables
            DoCmd.TransferDatabase acExport, "Microsoft Access", txt_path.Value, acTable, "TBL_SITE", "TBL_SITE"
            DoCmd.TransferDatabase acExport, "Microsoft Access", txt_path.Value, acTable, "TBL_VALIDATEUR", "TBL_VALIDATEUR"
            DoCmd.TransferDatabase acExport, "Microsoft Access", txt_path.Value, acTable, "TBL_GRILLE", "TBL_GRILLE"
            DoCmd.TransferDatabase acExport, "Microsoft Access", txt_path.Value, acTable, "TBL_POSTE", "TBL_POSTE"
            DoCmd.TransferDatabase acExport, "Microsoft Access", txt_path.Value, acTable, "TBL_EQUIPEMENT", "TBL_EQUIPEMENT"
            DoCmd.TransferDatabase acExport, "Microsoft Access", txt_path.Value, acTable, "TBL_EQUIP_GRILLE", "TBL_EQUIP_GRILLE"
     
            'Récupération des relations dans une table temporaire
            sqlString = "Create table temp (relationName varchar(30),tableName varchar(30),relForeignTable varchar(30),relAttributes varchar (30))"
            DoCmd.RunSQL sqlString
            For Each rel In CurrentDb.Relations
                  sqlString = "Insert into temp values ('" & rel.Name & "', '" & rel.Table & "', '" & _
                                                rel.ForeignTable & "','" & rel.Attributes & "')"
                DoCmd.SetWarnings (False)
                    DoCmd.RunSQL sqlString
                DoCmd.SetWarnings (True)
     
    '            CurrentDb.Relations.Delete rel.Name
            Next rel
     
            'Création des relations dans la copie
            Set dbBackup = DBEngine.OpenDatabase(txt_path.Value, dbLangGeneral, False)
            Set db = Application.CurrentDb
            sqlString = "Select * from temp"
            Set rs = db.OpenRecordset(sqlString)
            If Not rs.EOF Then
                rs.MoveFirst
                While Not rs.EOF
                    Set rel = dbBackup.CreateRelation(rs.Fields("relationName"), rs.Fields("tableName"), rs.Fields("relForeignTable"), rs.Fields("relAttributes"))
                    dbBackup.Relations.Append rel
                rs.MoveNext
                Wend
            End If
            dbBackup.Close
     
            progressBar.Value = 100
     
            MsgBox ("Export terminé! ")

  4. #4
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Oui mais ca j'ai trouvé ^^
    Si tu ne le dis pas je ne peux pas le deviner
    Je n'ai pas de boule de cristal


    Le While Not que tu as est quand même bien différent de ce que tu as trouvé

  5. #5
    Membre habitué Avatar de Orionmel
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 174
    Points : 185
    Points
    185
    Par défaut
    Ben il est différent uniquement dans le fait que je le fais dans ma base exportée et non dans la base courante.

    Le but du code que j'ai trouvé est de recréer les relations dans la table actuelle, là, je veux copier celle que j'ai dans ma base exportée. Il y'a juste la base qui change.

    A moins que j'ai mal regardé ??

  6. #6
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Code original
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            While Not rs.EOF
                Set rel = db.CreateRelation(rs.Fields("relationName"), rs.Fields("tableName"), rs.Fields("relForeignTable"), rs.Fields("relAttributes"))
                Set myField = rel.CreateField(rs.Fields("relField"))
                myField.ForeignName = rs.Fields("relForeignField")
                rel.Fields.Append myField
                CurrentDb.Relations.Append rel
            rs.MoveNext
            Wend
    Il te manque ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set myField = rel.CreateField(rs.Fields("relField"))
    myField.ForeignName = rs.Fields("relForeignField")
    rel.Fields.Append myField
    A mon avis, tu devrais suivre à peu de chose près la même procédure (comme tu le dis ce qui change c'est que tu fais ça dans une autre base mais le principe est le même).

    Crées une table où tu vas stocker tes relations.
    Reprend la fonction qui supprime les relations en enlevant cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       CurrentDb.Relations.Delete rel.Name
    Et sers toi de la fonction de création (avec les lignes manquantes) en l'adaptant au fait que tu refais les relations sur une autre base de données. (ce que tu as déjà fait)

    Et ça devrait fonctionner au poil.

Discussions similaires

  1. [OoO-Base] Créer des relations 0,N
    Par Mut dans le forum Autres SGBD
    Réponses: 0
    Dernier message: 06/02/2012, 10h08
  2. [AC-2003] Créations des Relations par VBA
    Par jmde dans le forum VBA Access
    Réponses: 0
    Dernier message: 24/03/2011, 12h32
  3. [AC-2003] créer une relation en vba/sql
    Par Oliver_WF dans le forum VBA Access
    Réponses: 4
    Dernier message: 25/10/2010, 17h38
  4. [AC-2003] Créer des onglets en VBA
    Par stigma dans le forum VBA Access
    Réponses: 6
    Dernier message: 10/05/2010, 10h50
  5. Créer des champs en vba
    Par devdev dans le forum VBA Access
    Réponses: 3
    Dernier message: 03/03/2009, 12h22

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