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 :

requetes imbriquées en VBA


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut requetes imbriquées en VBA
    bonjour,

    j'ai un problème avec des requetes imbriqués.

    mon but est le suivant: j'ai des enregistrements avec plusieur données stokées dans plusieurs tables.
    je désire trié mes enregistrements a l'aide d'un formulaire ça marche en calculant ma requete en VBA.
    ensuite j'affiche le résultat dans un état.

    dans un cas d'affichage ça me pose un problème, il faut que je compte le nombre d'enregistrement par client et sur l'état je classe l'ensemble grace à ce chiffre le tout en fonction du trie selectionné.

    j'avais créé hors Vba une requete reference croisée qui me permettait de connaitre le nombre d'enregistrement correspondant aux clients mais elle ne tenait pas compte du trie. donc il faut que je l'imbrique dans ma requete VBA pour avoir les bonnes valeurs.

    aprés plusieurs tentative j'ai réussi l'imbrication en la testant dabord en SQl avec la clause where tel quelle peux etre calculé:
    (en vert la requete qui compte, en rouge la requete de trie sur laquelle est basé le tri)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE], TAB_B.[Total de Code_a]
    FROM ((Personnel RIGHT JOIN ((Code_travail RIGHT JOIN Activité ON Code_travail.code_T = Activité.Code_t) LEFT JOIN Listing_producteur ON (Activité.code_l_prod = Listing_producteur.num_l_prod) AND (Activité.code_prod = Listing_producteur.[CODE PROD])) ON Personnel.Code_p = Activité.Code_p) 
    LEFT JOIN (SELECT TAB_A.code_l_prod, Count(TAB_A.Code_a) AS [Total de Code_a]
                FROM (                   SELECT Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE]
                       FROM (Personnel RIGHT JOIN (((Code_travail RIGHT JOIN Activité ON Code_travail.code_T = Activité.Code_t) LEFT JOIN detail_activite ON Activité.Code_a = detail_activite.code_a) LEFT JOIN Listing_producteur ON (Activité.code_l_prod = Listing_producteur.num_l_prod) AND (Activité.code_prod = Listing_producteur.[CODE PROD])) ON Personnel.Code_p = Activité.Code_p)
                       WHERE ((Activité.code_p=3) And (Activité.Date_a Is Null Or Activité.Date_a Is Not Null) And (Activité.lieu_a="Divers") And (Activité.code_t Is Null Or Activité.code_t Is Not Null) And (detail_activite.detail_da Is Null Or detail_activite.detail_da Is Not Null) And (Activité.code_l_prod Is Null Or Activité.code_l_prod Is Not Null)And (Listing_producteur.AGRICONF Is Null Or Listing_producteur.AGRICONF Is Not Null) And (Listing_producteur.TSE Is Null Or Listing_producteur.TSE Is Not Null))
                       GROUP BY Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE])
                 AS TAB_A
                 GROUP BY TAB_A.code_l_prod) 
    AS TAB_B ON Activité.code_l_prod = TAB_B.code_l_prod) LEFT JOIN detail_activite ON Activité.Code_a = detail_activite.code_a
    WHERE (((Activité.Code_p)=3) AND ((Activité.Date_a) Is Null Or (Activité.Date_a) Is Not Null) AND ((Activité.lieu_a)="Divers") AND ((Activité.Code_t) Is Null Or (Activité.Code_t) Is Not Null) AND ((detail_activite.detail_da) Is Null Or (detail_activite.detail_da) Is Not Null) AND ((Activité.code_l_prod) Is Null Or (Activité.code_l_prod) Is Not Null) AND ((Listing_producteur.AGRICONF) Is Null Or (Listing_producteur.AGRICONF) Is Not Null) AND ((Listing_producteur.TSE) Is Null Or (Listing_producteur.TSE) Is Not Null))
    GROUP BY Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE], TAB_B.[Total de Code_a];
    ça fonctionne, donc je voudrait la mettre dans VBa pour pouvoir calculer comme avant ma clause where. mais je ne parviens pas à la faire fonctionner tel qu'elle est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL = "SELECT Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE], TAB_B.[Total de Code_a]"
    SQL = SQL & "FROM ((Personnel RIGHT JOIN ((Code_travail RIGHT JOIN Activité ON Code_travail.code_T = Activité.Code_t) LEFT JOIN Listing_producteur ON (Activité.code_l_prod = Listing_producteur.num_l_prod) AND (Activité.code_prod = Listing_producteur.[CODE PROD])) ON Personnel.Code_p = Activité.Code_p) LEFT JOIN (SELECT TAB_A.code_l_prod, Count(TAB_A.Code_a) AS [Total de Code_a]"
    SQL = SQL & "FROM (SELECT Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE]"
    SQL = SQL & "FROM (Personnel RIGHT JOIN (((Code_travail RIGHT JOIN Activité ON Code_travail.code_T = Activité.Code_t) LEFT JOIN detail_activite ON Activité.Code_a = detail_activite.code_a) LEFT JOIN Listing_producteur ON (Activité.code_l_prod = Listing_producteur.num_l_prod) AND (Activité.code_prod = Listing_producteur.[CODE PROD])) ON Personnel.Code_p = Activité.Code_p)"
    SQL = SQL & "WHERE ((Activité.Code_p = 3) And (Activité.Date_a Is Null Or Activité.Date_a Is Not Null) And (Activité.lieu_a = 'Divers') And (Activité.Code_t Is Null Or Activité.Code_t Is Not Null) And (detail_activite.detail_da Is Null Or detail_activite.detail_da Is Not Null) And (Activité.code_l_prod Is Null Or Activité.code_l_prod Is Not Null) And (Listing_producteur.AGRICONF Is Null Or Listing_producteur.AGRICONF Is Not Null) And (Listing_producteur.TSE Is Null Or Listing_producteur.TSE Is Not Null))"
    SQL = SQL & "GROUP BY Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE])AS TAB_A"
    SQL = SQL & "GROUP BY TAB_A.code_l_prod) AS TAB_B ON Activité.code_l_prod = TAB_B.code_l_prod) LEFT JOIN detail_activite ON Activité.Code_a = detail_activite.code_a"
    SQL = SQL & "WHERE (((Activité.Code_p) = 3) And ((Activité.Date_a) Is Null Or (Activité.Date_a) Is Not Null) And ((Activité.lieu_a) = 'Divers') And ((Activité.Code_t) Is Null Or (Activité.Code_t) Is Not Null) And ((detail_activite.detail_da) Is Null Or (detail_activite.detail_da) Is Not Null) And ((Activité.code_l_prod) Is Null Or (Activité.code_l_prod) Is Not Null) And ((Listing_producteur.AGRICONF) Is Null Or (Listing_producteur.AGRICONF) Is Not Null) And ((Listing_producteur.TSE) Is Null Or (Listing_producteur.TSE) Is Not Null))"
    SQL = SQL & "GROUP BY Activité.Code_a, Activité.Code_p, Activité.Code_t, Activité.Date_a, Activité.tps_H_a, Activité.tps_M_a, Activité.code_prod, Activité.code_l_prod, Activité.commentaire_a, Activité.lieu_a, Code_travail.Intitule, Listing_producteur.CANTON, Listing_producteur.[NOM PROD MEMBRES], Listing_producteur.[ADR PROD VILLE], Personnel.Nom_p, Personnel.Prenom_p, Listing_producteur.TITRE, Listing_producteur.[NOM SOCIETE], TAB_B.[Total de Code_a];"
    
    Report.RecordSource = SQL
    ça fait l'erreur suivante "expression de jointure non suportée"
    pourquoi la requete dans access fonctionne bien et qu'elle ne fonctionne pas en Vba
    J'ai surement fait une erreur mais laquelle?
    merci d'avance pour votre aide

  2. #2
    Membre confirmé Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut sur de rien
    est-ce que ça ne pourrait pas venir de ton "Divers" en sql que tu transforme en vba par 'Divers' ?

    Si c'est le cas tu as moyens de créer des double cotes : " même en vba ainsi :
    "Divers" en sql devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim ls_guill as string
    ls_guill = chr$(34)
     
    SQL = "debut_de_la_requete " & ls_guill & "Divers" & ls_guill & " fin_de_la_requete"
    en esperant avoir servi à quelque chose

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Par défaut
    Salut,
    Pense à mettre un espace en fin de chaque ligne sauf la dernière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL = "....TAB_B.[Total de Code_a]"
    SQL = SQL & "FROM ((Personnel RIGHT JOIN ((Code_travail RIGHT JOIN Activité ...."
    Donnera en mode débug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "....TAB_B.[Total de Code_a]FROM ((Personnel RIGHT JOIN ((Code_travail RIGHT JOIN Activité ...."
    La partie en gras va planter car il faut avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "....TAB_B.[Total de Code_a] FROM ((Personnel RIGHT JOIN ((Code_travail RIGHT JOIN Activité ...."

  4. #4
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    merci kikof,
    c'était bien le problème des espaces, je ne m'en souvenais plus.

    maintenant il me signale comme erreur:
    "le champs "activité!tps_h_a" peut désigner plusieurs tables listées dans la clause from de votre sql"

    pourquoi me le fait il en VBA et pas dans ma requete directe, ça m'échape un peu

    avez vous une idée?
    merci pour votre aide

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Par défaut
    Dans ta requête en rouge : renomme ta table activité avec un Alias du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = SQL & "FROM (Personnel RIGHT JOIN (((Code_travail RIGHT JOIN Activité As ActiviteBis...
    Et tu te sers de cet alias pour accéder aux champs.
    Je pense que tu auras le même problème avec les autres tables de ta requête imbriquée.

  6. #6
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    c'est ce que je pensais mais je ne comprend pas que ça marche hors vba, normalement je devrais rencontrer le même problème non?

    de plus je vais être embeter dans la suite car ma clause Where est calculé dans un autre module VBa, si je modifie le nom de mes tables je vais devoir créer deux equations pour creer me requete

    merci d'avance de votre aide et de votre soutien

Discussions similaires

  1. Equivalent d'une requete imbriquée ??
    Par webtheque dans le forum Requêtes
    Réponses: 8
    Dernier message: 31/08/2004, 10h07
  2. (VBA-A] Requete access sous VBA
    Par vanima dans le forum VBA Access
    Réponses: 12
    Dernier message: 20/07/2004, 16h07
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Requetes imbriquées et jointures
    Par Emile Le Tueur* dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2004, 23h12
  5. Requete imbriquée sur Firebird ou Interbase
    Par Thib dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 09h00

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