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 :

Ouvrir une requête d'une base depuis une autre base avec OpenQuery ?


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Ouvrir une requête d'une base depuis une autre base avec OpenQuery ?
    Salut,

    je n'y connais rien en développement VBA et là j'ai un petit problème autour duquel je tourne depuis quelques heures sans trouver de solutions.
    Je me suis basé sur ce que j'ai pu trouver dans la FAQ, sur le net et dans le forum mais avec un stock de notions qui m'échappent quelque peu...

    Il y a 2 parties :

    1 - J'ai une base vide qui me servira à "récolter" des statistiques issues de requêtes disséminées dans n fichiers *.mdb. Je dois donc pouvoir y ouvrir ces requêtes stats
    2 - le nombre de fichiers *.mdb étant variables (par contre dans chacun il y a toujours une requête "stats" avec la même structure), il faudrait que le code aille lire tous les fichiers d'un même répertoire et me liste l'ensemble des requêtes stats les unes à la suite des autres.

    Bon, comme je suis une bille déjà je bloque sur la question 1.
    J'ai créé un formulaire avec un bouton pour déclencher la routine.
    A priori j'accde bien à la base, mais par contre Access me colle une erreur 7874 en indiquant "Impossible de trouver l'objet "Stats"" (qui existe pourtant bien dans ma base).
    J'ai activé les références "ADO 2.8" / "DAO 3.6".
    La base dans laquelle se trouve la requête est fermée sur ma machine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub DAOStatistiques_Click()
     
    Dim db As DAO.Database
    Dim stDocName As String
     
    Set db = DBEngine.OpenDatabase("D:\Bases\Base001.mdb")
     
        stDocName = "Stats"
        DoCmd.OpenQuery stDocName, acNormal, acEdit
     
    db.Close
     
    End Sub

    Pour le point 2 je n'ai même pas commencé à chercher la solution (qui ne doit pas être bien compliquée j'imagine)

    Que faire ?....
    Peut-être est-ce simplement la méthode qui n'est pas bonne ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par stefposs
    1 - J'ai une base vide qui me servira à "récolter" des statistiques issues de requêtes disséminées dans n fichiers *.mdb. Je dois donc pouvoir y ouvrir ces requêtes stats

    J'ai créé un formulaire avec un bouton pour déclencher la routine.
    A priori j'accde bien à la base, mais par contre Access me colle une erreur 7874 en indiquant "Impossible de trouver l'objet "Stats"" (qui existe pourtant bien dans ma base).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub DAOStatistiques_Click()
     
    Dim db As DAO.Database
    Dim stDocName As String
     
    Set db = DBEngine.OpenDatabase("D:\Bases\Base001.mdb")
     
        stDocName = "Stats"
        DoCmd.OpenQuery stDocName, acNormal, acEdit
     
    db.Close
     
    End Sub
    Tu fais une confusion en mélangeant 2 "domaines" qui se recoupent partiellement :
    - l'application Access, d'une part,
    - l'accès aux données d'autres part.

    Certaines fonctions permettent de construire des ponts entre ces 2 "domaines" et de les faire coopérer harmonieusement.

    Avec DoCmd tu travailles localement, au niveau de l'application Access. Tu agis sur l'interface utilisateur (par exemple ouvrir ou fermer un formulaire, afficher une fenêtre qui contient le jeu de données d'une requête...) dans un périmètre limité aux objets Access contenus dans le fichier MDB.
    ( objets Access = formulaires, requêtes, états, macros, modules )

    Avec DBEngine, tu travailles au niveau du moteur de bases de données. Il ne connait rien aux formulaires ni aux états; il ne sait pas afficher un jeu de données. En revanche, il sait agir sur une base de données, travailler sur les données, exécuter des requêtes (mais pas les afficher). Il peut accéder aux tables et requêtes de la base de données courantes ou contenues dans des BD externes.

    Pour revenir à ton code et à l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        stDocName = "Stats"
        DoCmd.OpenQuery stDocName, acNormal, acEdit
    DoCmd ne sait ouvrir une requête que si elle est contenue dans l'application Access (le fichier MDB courant).
    Ici la requête "Stats" n'est pas contenue dans l'application Access; elle est hors de portée de la méthode DoCmd.
    D'où l'erreur: ça ne peut pas fonctionner.

    -=-=-=-=-=-=-=-=-=-=-=-=-=-

    Pour te faire avancer un peu j'ai besoin de plus de précision.
    Tu ne dis pas comment tu vas "récolter" les données... Peut-être dans une table unique dans laquelle tu vas "déverser" les données retournées par les requêtes STATS ?

    Supposons que cette table unique de destination s'appelle T_STATS.
    Tu pourrais tout simplement exécuter une requête SQL qui se chargerait d'exécuter la requête "externe" et de récupérer le jeu de données obtenu en l'ajoutant à ta table locale T_STATS.

    Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO T_STATS 
    SELECT STATS.*
    FROM STATS IN "D:\Bases\Base001.mdb";
    En l'adaptant à ton code, ça donnerait quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub DAOStatistiques_Click()
        Dim stPathDB As String
        dim stSQL as String
     
        stPathDB = "D:\Bases\Base001.mdb"
     
        stSQL = "INSERT INTO T_STATS SELECT STATS.* FROM STATS IN """ & stPath & """;"
     
        Application.CurrentDB.Execute stSQL
    End Sub
    Avec cette procédure, nous nous "cantonnons" seulement au "domaine" de l'accès aux données.

    -=-=-=-=-=-=-=-=-=-=-=-=-=-

    Citation Envoyé par stefposs
    2 - le nombre de fichiers *.mdb étant variables (par contre dans chacun il y a toujours une requête "stats" avec la même structure), il faudrait que le code aille lire tous les fichiers d'un même répertoire et me liste l'ensemble des requêtes stats les unes à la suite des autres.

    Pour le point 2 je n'ai même pas commencé à chercher la solution (qui ne doit pas être bien compliquée j'imagine)
    Dans la FAQ Access, il y a un exemple de parcours d'un répertoire pour obtenir la liste des fichiers qu'il contient (facile à adapter):
    Comment obtenir le contenu d'un répertoire ?
    _

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 23
    Points
    23
    Par défaut Question UPDATE dans une autre base
    Bonjour,

    Actuellement j'utilise deux base access différent, depuis la Base 1, j'arrive belle est bien a récupérer les enregistrement dans la base 2, mais toujours depuis la base 1 je n'arrive pas a mettre a jour l'enregistrement dans la Base 2.

    est il possible de le faire en utilisant ce genre de code mais avec un UPDATE?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub DAOStatistiques_Click()
        Dim stPathDB As String
        dim stSQL as String
     
        stPathDB = "D:\Bases\BASEPRODUIT.mdb"
     
        stSQL = "UPDATE T_PRODUIT SET DESIGNATION = 'PRODUIT1111' IN """ & stPath & """ WHERE CODEPRODUIT = "PROD001-15" ;"
     
        Application.CurrentDB.Execute stSQL
    End Sub
    Merci d'avance

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonjour,

    Directement avec du code SQL, une tentative et une proposition a été faite par Thierry Pallier dans le post ICI.
    Cela devrait se faire je pense.

    Sinon, faire la mise à jour en passant DAO devrait aussi être possible.

    Cordialement,

    PS: Mets tes codes dans les balises correspondantes quand tu les postes sur le forum pour une meilleure lisibilité : Tu les sélectionnes et cliques sur #.

Discussions similaires

  1. faire une requête sur le résultat d'une requête
    Par clanou01 dans le forum Requêtes
    Réponses: 6
    Dernier message: 28/08/2012, 11h44
  2. Réponses: 2
    Dernier message: 01/12/2008, 18h43
  3. Ouvrir une base depuis une base
    Par edhos dans le forum VBA Access
    Réponses: 1
    Dernier message: 31/01/2008, 07h06
  4. Réponses: 6
    Dernier message: 03/04/2007, 10h19
  5. Réponses: 4
    Dernier message: 16/09/2003, 10h51

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