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

Macros et VBA Excel Discussion :

Union de bases de données ou recordset [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut Union de bases de données ou recordset
    Bonjour,
    Je travaille sur des statistiques venant de plusieurs bases de données identiques au format .mdb
    J'aimerais unir plusieurs bases de données et y appliquer un seul recordset.
    Je précise que je n'ai pas ACCESS et que mes bases de données contiennent plusieurs tables (donc UNION en SQL n'est pour moi pas utilisable)
    Principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Set base(1) = DBEngine.OpenDatabase(chemin_bd(1))
    Set base(2) = DBEngine.OpenDatabase(chemin_bd(2))
    .
    .
    .
     
    Set base(n) = DBEngine.OpenDatabase(chemin_bd(n))
    Set base_ppl = base(1) + base(2) + ... + base(n)
     
    Set enr = base_ppl.OpenRecordset("SELECT * FROM uneTable", dbOpenDynaset)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    With creatobject("Adodb.Connection")
    .open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myrep\base1.mdb;"
     
    Sql ="select * from table1 "
    Sql=sql & " union all"
    Sql=sql & " select * from table2 in ('c:\myrep\base2.mdb')"
    Set rs=.execute(sql)
    Rs.close
    Set rs=nothing
    .close
    End with
    End sub

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    Merci pour la réponse rapide. Je vais tester.
    Mais comme je suis jeune dans le SQL et les bases de données, j'ai donc quelques questions peut-être idiotes :
    1) quel type de variable est creatobject car j'ai une erreur "block with non défini" ?
    2) je travail sur mon recordSet après le code suivant ?Je comprends vite mais faut m'expliquer longtemps

  4. #4
    Invité
    Invité(e)
    Par défaut
    Non car ici on utilise createobject qui gère le activex dynamiquement.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Désolé, mais si je me fait appeler dysorthographie c'est pas pour rien

    CreateObject

    https://msdn.microsoft.com/fr-fr/vba...bject-function

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    (Désolé, je l'avais pris pour une variable)

    Test infructueux : Erreur dans la requête.

    Dans mon code la table a le même nom comme ici table1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sql ="select * from table1"
    Sql=sql & " union all"
    Sql=sql & " select * from table1 in ('c:\myrep\base2.mdb')"
    Le soucis vient je pense de "IN". Pour moi, il n'est utilisé que avec "WHERE"
    Ou peut-être me trompe-je?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Testes comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fichier & ";Persist Security Info=False"

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    Merci pour les recherches mais maintenant, j'ai une autre erreur :
    Nom : Sans titre.png
Affichages : 141
Taille : 4,4 Ko

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le in indique qu'il s'agit d'une jointure externe vers une autre base Access et n'a rien à voir avec le where!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sql ="select * from table1 "
    Slq=sql & " where champs1='toto' "
    Sql=sql & " union all"
    Sql=sql & " select * from table1  in ('c:\myrep\base2.mdb')"
    Sql=sql & " where  champs1='titi'"
    b

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    Merci pour le IN
    J'ai toujours une erreur mais je pense savoir pourquoi. Au début, il y avait une erreur sur ce code J'ai donc déclaré rs mais sans doute que ce n'était pas le bon type de variable

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Ça ne m'étonne pas, c'est la méthode qu'on utilisait pour Access 2003 (mdb)

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut Solution trouvée !!
    Bonjour et merci à dysorthographie pour m'avoir suivi dans mon désordre et mon ignorance qui diminue au fil des conversations
    Pour résoudre mon problème, j'ai suivi quelques tutos et notamment :
    https://warin.developpez.com/access/dao/?page=partie_4#

    Mon problème :

    J'ai 8 bases de données identiques (sauf les données) et je veux faire des stat sur les 8 bases en même temps.

    dysorthographie me propose de passer par des requêtes SQL avec "UNION ALL IN ('C:\myrep\bd1.mdb')" etc...
    Malheureusement les requêtes ne passent pas, pour quelle raison ? Je ne sais pas (encore).

    Je me dirige vers ma première intuition : faire une base de données contenant mes 8 bases et ensuite faire des requêtes SQL sur cette base.
    La tâche est rude pour mes petites connaissances mais le tuto ci-dessus m'a ouvert l'esprit. J'y est trouvé ma solution:

    - Créer un base de données vierge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set wrkAcc = CreateWorkspace("AccessWorkspace", "admin", "", dbUseJet)
        If Dir("C:\myrep\NewDB.mdb") <> "" Then Kill "C:\myrep\NewDB.mdb"
        Set dbsNew = wrkAcc.CreateDatabase("C:\myrep\NewDB.mdb", dbLangGeneral)
    - Créer la table qui m'intéresse dans cette base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set nouvelleTable = dbsNew.CreateTableDef("maTable")
    - Créer les Champs de cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 0 To BD.TableDefs("maTable").Fields.Count - 1 'BD étant la base de données à copier
            With BD.TableDefs("maTable").Fields(i)
                nouvelleTable.Fields.Append nouvelleTable.CreateField(.Name, .Type, .Size)
            End With
        Next i
        dbsNew.TableDefs.Append nouvelleTable
    - Copier les valeurs dans la nouvelle table grâce aux RecordSet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Enr.MoveFirst 'Enr étant le recordSet de la table à copier
            Do
                rstNew.AddNew 'rstNew étant le recordSet de la nouvelle table
                For i = 0 To Enr.Fields.Count - 1
                    If Enr.Fields(i) <> "" Then rstNew.Fields(i) = Enr.Fields(i)
                Next i
                rstNew.Update
                Enr.MoveNext
            Loop Until Enr.EOF
    Voilà il y a certainement un meilleurs moyen mais pour moi le résultat est là. L'inconvénient est qu'il me faut 5 min pour pouvoir créer ma nouvelle base de données qui fait maintenant 2 Go. Pour un traitement mensuel, c'est honorable!
    Je laisse ces bouts de programme pour les plus compétants ça peut être clair et pour ceux qui veulent des infos supplémentaires (comme le dimensionnement des variables) n'hésitez pas à me contacter.

    Je n'ai pas encore testé le SQL sur cette nouvelle base de données, j'espère que ça va passer (pour info, je n'ai pas indexé ma table je ne sais pas si c'est important pour mon utilisation)

  13. #13
    Invité
    Invité(e)
    Dernière modification par Invité ; 04/10/2018 à 23h56.

  14. #14
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    Ca se décante :
    Par contre j'ai toujours mon erreur de syntaxe dans la clause From.
    J'ai isolé certains éléments de la requête SQL et le problème vient de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sql=sql & " union all"
    Sql=sql & " select * from table1  in ('c:\myrep\base2.mdb')"
    Alors j'ai peut-être un indice : mon répertoire contient des espaces exple :Ca peut venir de là?

  15. #15
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    J'ai testé, toujours pareil avec des répertoire sans "espace" et un fichier de base de données moins long mais c'est toujours pareil…

    Donc ce n'est pas un soucis de longueur de caractères ou "d'espace" de la chaine du répertoire de la base de données. Ca vient de la requête SQL.

    J'ai donc testé cette requête avec la méthode que j'employais avant avec des openRecordset et dataBase et c'est la même chose.

    "IN" n'est pas pris en compte pour moi dans mon script. Il doit me manquer autre chose comme une option ou un truc comme ça. Je suis sur que c'est un truc tout bête.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    dézip le répertoire sur ton bureau et fais un teste!
    Fichiers attachés Fichiers attachés

  17. #17

  18. #18
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    Je n'ai pas Acces

  19. #19
    Invité
    Invité(e)
    Par défaut
    Je sais mais ça te montre que ça marche

    Tu as u message d'erreur ? Si oui fais un imprimer écran.

  20. #20
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2018
    Messages : 15
    Par défaut
    Désolé pour le temps, j'ai fait une petite pause :
    Nom : erreur.png
Affichages : 345
Taille : 23,3 Ko
    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
    Private Sub CommandButton1_Click()
        Dim sql As String
        Dim rs As Object
     
        With CreateObject("Adodb.Connection")
            .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\my rep\mabase1.MDB;"
     
            sql = "select * from table1"
    '        sql = sql & " where champ1='toto'"
            sql = sql & " union all"
            sql = sql & " select * from table1 in (FILENAME='C:\my rep\mabase2.MDB')"
    '        sql = sql & " where table1='toto'"
            Set rs = .Execute(sql)
            rs.Close
            Set rs = Nothing
            .Close
        End With
     
    End Sub

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/11/2013, 09h52
  2. Recordset.Delete et base de données
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/03/2009, 11h22
  3. Réponses: 2
    Dernier message: 27/02/2008, 12h19
  4. Réponses: 13
    Dernier message: 20/04/2006, 15h37
  5. [Concept] Stabilité d'une base de donnée
    Par lassmust dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/07/2002, 16h16

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