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

Langage SQL Discussion :

Requêtes corrélées dans Access passage en VBA


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Requêtes corrélées dans Access passage en VBA
    Bonjour,

    J'ai réalisé sur Access une requête puis j'ai fait une deuxième requête à partir du résultat de la première (requêtes corrélées). Je souhaite à présent la mettre dans du VBA. Or en VBA les requêtes ne portent pas de nom et je ne peux pas faire ma deuxième requête sur la première sans ce nom.

    J'ai vu une solution avec le IN mais j'ai l'impression que c'est uniquement avec une table et non le résultat d'une requête passée je me trompe ? J'ai consulté ce site :https://sql.sh/cours/sous-requete
    Si certains se sont déjà posé cette question merci à eux de m'apporter leur aide.

    Bonne après-midi enneigée

    MG

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Pourquoi ne pas "fusionner" les deux requêtes en une seule, au lieu de les lancer séparément ?

    Tatayo.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Non impossible de procéder ainsi

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    Citation Envoyé par man330044 Voir le message
    J'ai vu une solution avec le IN mais j'ai l'impression que c'est uniquement avec une table et non le résultat d'une requête passée je me trompe ?
    L'opérateur IN attend une sous-requête, quelle que soit sa complexité.

    Il faudrait donner un peu plus de détails pour obtenir une réponse adaptée au besoin
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Il faudrait que tu nous montres les 2 requêtes en question. Si tu ne peux pas combiner les 2 requêtes alors peut-être que tu devras boucler sur le recordset obtenu par la première requête pour faire la 2è requête, mais ça risque d'être peu performant.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour à vous,

    Il est impossible de vous montrer les requêtes puisqu'elles sont retenues par le secret professionnel. J'ai essayé de refaire une requête similaire avec des tables que j'ai construites mais je n'ai pas réussi à faire quelque chose de fonctionnel.

    Je vais essayer de vous expliquer le but de cette manœuvre en étant la plus claire possible :

    Un assemblage est unique par sa référence, cette assemblage est composé de différents produits stockés dans des lignes (10,20,30 ...) pour ma requête j'ai besoin d'extraire toutes les lignes 10 et 30 de chaque assemblage. Je souhaite que les lignes 10 et 30 soient sur une unique ligne dans la table finale or pour ça je suis obligée de faire deux requêtes sinon j'ai deux lignes par assemblage.
    Dans access cela fonctionne très bien de faire deux requêtes mais en VBA je ne sais pas comment faire.

    Un exemple tout bête je veux : Dans un carré savoir la couleur du coté haut (contenue sur la ligne 10) et la couleur du coté en bas (contenue sur la ligne 30)

    En une seule requête, le tableau sera le suivant

    Réf            Type de forme   couleur coté   ligne
    
    362            Carré                rouge            10
    362            Carré                bleu              30
    En deux requêtes corrélées

    Réf            Type de forme   couleur haut     couleur bas
    362            Carré                rouge              bleu
    Merci à vous pour le temps passé, j'espère avoir été a peu près claire

    Bonne journée

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bon apparemment le site ne prend pas en compte les espaces multiples mes tables ne sont pas très bien représentées ...

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    Pour mettre en forme du code, tu peux le placer entre les balises [CODE] et [/CODE].
    Pour du texte en largeur fixe il y a aussi [PRE] et [/PRE].

    Pour répondre à ton besoin, il faudrait effectuer un pivot.
    Si ton SGBD ne supporte pas cette instruction, tu peux le faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  "Réf"
        ,   "Type de forme"
        ,   max(case ligne when 10 then "couleur coté" end) as "couleur haut"
        ,   max(case ligne when 30 then "couleur coté" end) as "couleur bas"
    from    ma_requête
    group by "Réf"
        ,   "Type de forme"
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    D'après ce que tu nous montres, c'est faisable avec une seule requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.ref,t1.type,t1.couleur as haut,t2.couleur as bas
    from latable t1
    inner join latable t2. on t2.ref = t1.ref and t2.num = 30
    where t1.num = 10
    Tatayo.

  10. #10
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut Bonjour man330044, bonne année !
    • L'objet requête Access est assez particulier. Dans la perspective de construction de requêtes, on peut le considérer comme une vue.
    • Même s'il est très limité dans l'exercice, le moteur Jet d'Access accepte des requêtes imbriquées
    • VBA peut parfaitement lancer des requêtes enregistrées dans Access, il n'est pas limité à l'exécution de chaînes SQL. Sauf lorsque l'on travaille uniquement sur une connexion distante et non sur des tables Access (locales ou liées). En travaillant sur des tables Access on peut enregistrer des requêtes dans Access afin de les utiliser ensuite dans VBA avec les conditions de recherche appropriées. On peut aussi définir des requêtes paramétrées.
    • En l'occurrence il s'agit moins de requêtes corrélées que de jointure sur la fameuse référence, en rapprochant les différentes lignes, comme la requête proposée par Tatayo
    • Citation Envoyé par man330044 Voir le message
      Or en VBA les requêtes ne portent pas de nom et je ne peux pas faire ma deuxième requête sur la première sans ce nom.
      VBA permet de créer des requêtes et les enregistrer dans Access sous le nom que l'on souhaite. Sauf, encore une fois, quand on travaille via une connexion distante. Mais alors, avec un SGBDR différent, on peut y créer une vue ou une procédure stockée - qui ont toutes les chances d'être beaucoup plus performantes -, pour les utiliser ensuite dans VBA.


    Désolée pour ces considérations qui débordent du thème SQL mais me paraissent utiles à préciser dans un contexte VBA/Access loin des standards...
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Pour répondre à ton besoin, il faudrait effectuer un pivot.
    Si ton SGBD ne supporte pas cette instruction, tu peux le faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  "Réf"
        ,   "Type de forme"
        ,   max(case ligne when 10 then "couleur coté" end) as "couleur haut"
        ,   max(case ligne when 30 then "couleur coté" end) as "couleur bas"
    from    ma_requête
    group by "Réf"
        ,   "Type de forme"
    Je ne sais pas ce qu'est un pivot, et de plus je ne comprend pas pourquoi on identifie les valeurs maximale dans le select

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tatayo Voir le message
    D'après ce que tu nous montres, c'est faisable avec une seule requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.ref,t1.type,t1.couleur as haut,t2.couleur as bas
    from latable t1
    inner join latable t2. on t2.ref = t1.ref and t2.num = 30
    where t1.num = 10
    Tatayo.
    merci je vais essayer de l'appliquer, j'ai déjà pas mal de inner join, ici j'ai simplifié au maximum mais je vais essayer d'adapter merci

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Novembre 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Paraffine Voir le message
    • L'objet requête Access est assez particulier. Dans la perspective de construction de requêtes, on peut le considérer comme une vue.
    • Même s'il est très limité dans l'exercice, le moteur Jet d'Access accepte des requêtes imbriquées
    • VBA peut parfaitement lancer des requêtes enregistrées dans Access, il n'est pas limité à l'exécution de chaînes SQL. Sauf lorsque l'on travaille uniquement sur une connexion distante et non sur des tables Access (locales ou liées). En travaillant sur des tables Access on peut enregistrer des requêtes dans Access afin de les utiliser ensuite dans VBA avec les conditions de recherche appropriées. On peut aussi définir des requêtes paramétrées.
    • En l'occurrence il s'agit moins de requêtes corrélées que de jointure sur la fameuse référence, en rapprochant les différentes lignes, comme la requête proposée par Tatayo

    • VBA permet de créer des requêtes et les enregistrer dans Access sous le nom que l'on souhaite. Sauf, encore une fois, quand on travaille via une connexion distante. Mais alors, avec un SGBDR différent, on peut y créer une vue ou une procédure stockée - qui ont toutes les chances d'être beaucoup plus performantes -, pour les utiliser ensuite dans VBA.


    Désolée pour ces considérations qui débordent du thème SQL mais me paraissent utiles à préciser dans un contexte VBA/Access loin des standards...
    Je suis novice en langage sql et on m'a appris à directement écrire les requêtes dans mon vba .

Discussions similaires

  1. Requête récursive dans access
    Par Australia dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 29/07/2014, 15h15
  2. Réponses: 5
    Dernier message: 26/02/2008, 12h45
  3. Problême requête SQL dans access..Erreur 3079
    Par DavidGG dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/01/2008, 17h48
  4. [VB]Utilisé une requête enregistrée dans ACCESS
    Par anikeh dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 26/01/2006, 17h54
  5. problème requête between dans access
    Par Vodkha dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2005, 07h50

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