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 :

Traduction en VBA d'une requête Sélection SQL sur plusieurs tables


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Traduction en VBA d'une requête Sélection SQL sur plusieurs tables
    Bonjour à tous,
    Depuis un bon moment je cherche en vain une solution à mon problème, n'ayant pas trouver, je demande votre aide. (Je précise que je débute)

    Voilà je cherche à écrire une procédure sous VBA Access, permettant une recherche multicritères sur plusieurs tables.
    Qui doit envoyer le résultat d'une requête sélection dans une listbox d'un formulaire.
    Problème, j'ai vu qu'on ne peut pas utiliser la commande docmd.Runsql pour une requête sélection.
    Voici le code SQL de la requête qui par ailleurs fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [Liste domaines].Domaine, [Table générale].[Intitulé de l'affaire], [Table générale].[Nature de la Tâche], [Table générale].[Date de la commande], [Table générale].[Date à laquelle  la tâche doit être réalisée], [Table générale].[Travail en binome], [Listes Agent 1].[Prénom des agents] AS Agents, [Etat d'avancement].[Etat d'avencement], [Table générale].[Suivi de l'activité]
    FROM [Listes Agent 1] INNER JOIN ([Liste domaines] INNER JOIN ([Liste Agents 2] INNER JOIN ([Etat d'avancement] INNER JOIN [Table générale] ON [Etat d'avancement].N° = [Table générale].[Etat d'avancement]) ON [Liste Agents 2].N° = [Table générale].[Agent 2]) ON [Liste domaines].N° = [Table générale].Domaine) ON [Listes Agent 1].N° = [Table générale].[Agent 1];
    Voici le code VBA du formulaire : message d'erreur au niveau SQL="docmd.runSQL.....

    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
    49
    Private Sub RefreshRequery()      'Procédure Moteur de recherche
    Dim SQL As String                 'SQL désigne en fait la variable qui reçoit la requête
    SQL = "DoCmd.RunSQL("SELECT [Liste domaines].Domaine, [Table générale].[Intitulé de l'affaire], [Table générale].[Nature de la Tâche], [Table générale].[Date de la commande], [Table générale].[Date à laquelle  la tâche doit être réalisée], [Table générale].[Travail en binome], [Listes Agent 1].[Prénom des agents] AS Agents, [Etat d'avancement].[Etat d'avencement], [Table générale].[Suivi de l'activité] FROM [Listes Agent 1] INNER JOIN ([Liste domaines] INNER JOIN ([Liste Agents 2] INNER JOIN ([Etat d'avancement] INNER JOIN [Table générale] ON [Etat d'avancement].N° = [Table générale].[Etat d'avancement]) ON [Liste Agents 2].N° = [Table générale].[Agent 2]) ON [Liste domaines].N° = [Table générale].Domaine) ON [Listes Agent 1].N° = [Table générale].[Agent 1];")"
    If Me.chkNoms Then
       SQL = SQL & "And Listes Agent 1!Prenom des agents like '*& Me.cmbRechNoms &*'"
    End If
    If Me.chkDomaines Then
       SQL = SQL & "And Liste domaines!Domaine like '*& Me.cmbRechDomaines &*'"
    End If
    If Me.chkAvancement Then
        SQL = SQL & "And Etat d'avancement!Etat d'avencement like '*& Me.cmbRechAvancement &*'"
    End If
    SQL = SQL & ";"
    Me.lstRésultats.RowSource = SQL
    Me.lstRésultats.Requery
    End Sub
     
    Private Sub cmbRechAvancement_BeforeUpdate(Cancel As Integer)
    Me.cmbRechAvancement.Visible = Not Me.cmbRechAvancement.Visible
    RefreshRequery
    End Sub
     
    Private Sub chkNoms_Click()
    Me.cmbRechNoms.Visible = Not Me.cmbRechNoms.Visible
    RefreshRequery
     
    End Sub
     
    Private Sub chkDomaines_Click()
    Me.cmbRechDomaines.Visible = Not Me.cmbRechDomaines.Visible
    RefreshRequery
     
    End Sub
     
    Private Sub chkAvancement_Click()
    Me.cmbRechAvancement.Visible = Not Me.cmbRechAvancement.Visible
    RefreshRequery
     
    End Sub
     
    Private Sub cmbRechNoms_BeforeUpdate(Cancel As Integer)
    Me.cmbRechNoms.Visible = Not Me.cmbRechNoms.Visible
    RefresRequery
    End Sub
     
    Private Sub cmbRechDomaines_BeforeUpdate(Cancel As Integer)
    Me.cmbRechDomaines.Visible = Not Me.cmbRechDomaines.Visible
    RefreshRequery
    End Sub
    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 710
    Points : 847
    Points
    847
    Par défaut
    Salut et bienvenu sur le forum,

    Il te faut juste mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL = " SELECT[Liste  ....
    Parcontre, tu aurais trouver en recherchant un peu (en particulier sur cet exemple de recherche multicritaire)
    De plus merci d'utiliser les balises de code.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour Muhad'hib,

    C'est justement sur le code du lien que tu indiques que j'ai construit mon code, le seul problème c'est que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &SQL = " SELECT[Liste  ....
    marche bien lorsque les champs appartiennent à une même table non ? Dans ma requête ce n'est pas le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [Liste domaines].Domaine, [Table générale].[Intitulé de l'affaire], [Table générale].[Nature de la Tâche], [Table générale].[Date de la commande], [Table générale].[Date à laquelle  la tâche doit être réalisée], [Table générale].[Travail en binome], [Listes Agent 1].[Prénom des agents] AS Agents, [Etat d'avancement].[Etat d'avencement], [Table générale].[Suivi de l'activité]
    FROM [Listes Agent 1] INNER JOIN ([Liste domaines] INNER JOIN ([Liste Agents 2] INNER JOIN ([Etat d'avancement] INNER JOIN [Table générale] ON [Etat d'avancement].N° = [Table générale].[Etat d'avancement]) ON [Liste Agents 2].N° = [Table générale].[Agent 2]) ON [Liste domaines].N° = [Table générale].Domaine) ON [Listes Agent 1].N° = [Table générale].[Agent 1];
    Dans ma construction j'ai une table générale liée à "d'autres petites tables" (qui servent pour mes menus déroulants)
    Merci en tout d'avoir pris le temps de répondre.

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    • Enlève DoCmd.RunSQL
    • Le code SQL est du texte, que tu affectes à une variable de type String en le délimitant par des guillemets doubles (").
    • Par ailleurs, il ne faut pas mettre le point-virgule. Tu ne l'ajoutes qu'à la fin.
    • Il faut une clause WHERE. J'ai mis WHERE True pour que le code puisse ajouter d'autres conditions.
    • Les noms de tables et de champs doivent être encadrés pas des crochets droits s'ils contiennent des espaces ou des caractères réservés.
      On peut aussi mettre les crochets droits de manière systématique.

    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
    Private Sub RefreshRequery() 'Procédure Moteur de recherche
    Dim SQL As String 'SQL désigne en fait la variable qui reçoit la requête
     
    SQL = "SELECT[Liste domaines].Domaine, [Table générale].[Intitulé de l'affaire], [Table générale].[Nature de la Tâche], [Table générale].[Date de la commande], [Table générale].[Date à laquelle la tâche doit être réalisée], [Table générale].[Travail en binome],[Listes Agent 1].[Prénom des agents] AS Agents, [Etat d'avancement].[Etat d'avencement], [Table générale].[Suivi de l'activité] " & _
          "FROM[Listes Agent 1] INNER JOIN ([Liste domaines] INNER JOIN ([Liste Agents 2] INNER JOIN ([Etat d'avancement] INNER JOIN [Table générale] ON [Etat d'avancement].N° = [Table générale].[Etat d'avancement]) ON[Liste Agents 2].N° = [Table générale].[Agent 2]) ON[Liste domaines].N° = [Table générale].Domaine) ON[Listes Agent 1].N° = [Table générale].[Agent 1] " & _
          "WHERE True" 	  
     
    If Me.chkNoms Then
    SQL = SQL & " And [Listes Agent 1].[Prenom des agents] like '*" & Me.cmbRechNoms & "*'"
    End If
    If Me.chkDomaines Then
    SQL = SQL& " And [Liste domaines].[Domaine] like '*" & Me.cmbRechDomaines & "*'"
    End If
    If Me.chkAvancement Then
    SQL = SQL & " And [Etat d'avancement].[Etat d'avencement] like '*" & Me.cmbRechAvancement & "*'"
    End If
    SQL = SQL & ";"
    Me.lstRésultats.RowSource = SQL
    Me.lstRésultats.Requery
    End Sub
    A+

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 024
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 024
    Points : 24 570
    Points
    24 570
    Par défaut
    Bonjour et bienvenue !

    Le SQL comme le français et beaucoup plus conpréhensible avec des espaces ou il faut. En tout cas ACCESS va beaucoup plus apprécier.

    Ceci étant dit.

    Une fois que tu as placer le ; dans une requete SQL cela indique la fin... définitive de la syntaxe SQL. Inutile d'essayer d'y coller des choses derrière.

    Les conditions se font après le mot clef WHERE.

    Tu as un exemple de construction de requete dynamique dans plusieurs tuto sur la recherche (c'est à la page Cours).

    Pourquoi ne pas construire une requete dans le générateur avec quelques conditions puis avec le tuto (débogage de requete en VBA) la transférer.

    Comme tu le vois autant SQL que VBA sont des langages qui ne s'improvisent pas.

    Cordialement,

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour LedzepII,

    et merci pour ta réponse
    J'ai créé un formulaire tout simple pour tester ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub RefreshRequery()      'Procédure Moteur de recherche
    Dim SQL As String
    SQL = "SELECT[Liste domaines].Domaine, [Table générale].[Intitulé de l'affaire], [Table générale].[Nature de la Tâche], [Table générale].[Date de la commande], [Table générale].[Date à laquelle la tâche doit être réalisée], [Table générale].[Travail en binome],[Listes Agent 1].[Prénom des agents] AS Agents, [Etat d'avancement].[Etat d'avencement], [Table générale].[Suivi de l'activité] " & _
          "FROM[Listes Agent 1] INNER JOIN ([Liste domaines] INNER JOIN ([Liste Agents 2] INNER JOIN ([Etat d'avancement] INNER JOIN [Table générale] ON [Etat d'avancement].N° = [Table générale].[Etat d'avancement]) ON[Liste Agents 2].N° = [Table générale].[Agent 2]) ON[Liste domaines].N° = [Table générale].Domaine) ON[Listes Agent 1].N° = [Table générale].[Agent 1] " & _
          "WHERE True"
     
    Me.lstRésultats.RowSource = SQL
    Me.lstRésultats.Requery
     
    End Sub
    Malheureusement je n'ai aucun résultat dans le lstRésultats alors que la requête construire avec l'assistant requête d'Access( donc sans le "whrere true" dans le code SQL), fonctionne parfaitement.
    Où est donc le probléme?

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 024
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 024
    Points : 24 570
    Points
    24 570
    Par défaut
    Le générateur te corrige les espaces pas VBA.

    Mince ! il me semble que je me répète sur l'affaire des espaces...

    Je ne vois pas bien ou ça peut mener ce genre de syntaxe. Tu remarqueras qu'avec ou sans ça fonctionne dans le générateur.

  8. #8
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,
    Citation Envoyé par loufab Voir le message
    Je ne vois pas bien ou ça peut mener ce genre de syntaxe.
    Ça permet de concaténer directement les critères " And critère" sans se poser de questions.

    Si aucun critère, ne reste que <=> pas de clause Where.

    S'il y a des critères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where True And Critère1 [And Critère2 [...]]
    Le True derrière Where est donc un critère fictif toujours Vrai.

    Ça reste dans l'esprit du tuto de Caféine où la chaîne SQL de base comporte un critère toujours vrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where Medias!CodMedia <> 0
    J'ai fait pareil, mais en plus succinct, en remplaçant le critère par le résultat de son évaluation.

    A+

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 024
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 024
    Points : 24 570
    Points
    24 570
    Par défaut
    Bonjour,
    Oups ! J'ai réagis au dernier post de fajitas. C'est vrai que dans son contexte original c'est plus compréhensible.

    Reste ce problème d'espaces où avec ou sans le where true cela ne risque pas de changer grand chose.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je n'ai toujours pas compris l'utilisation du générateur d'expression et le transfert du code SQL dans VBA (notamment pour éviter les erreurs de synthaxe, espaces, guillemets et autres...). Je suis pressé par le temps j'y reviendrai plus tard j'ai téléchagé le tutoriel Ad Hoc.

    En attendant voici la solution (code SQL) que j'ai trouvée et qui fonctionne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Listes Agent 1].[Prénom des agents] AS Agent1, [Table générale].[Travail en binome] AS Binôme, [Liste Agents 2].[Prénom des agents] AS Agent2, [Liste domaines].Domaine, [Table générale].[Intitulé de l'affaire], [Table générale].[Nature de la Tâche], [Etat d'avancement].[Etat d'avancement], [Table générale].[Date de la commande], [Table générale].[Date à laquelle  la tâche doit être réalisée], [Table générale].[Suivi de l'activité]
    FROM [Listes Agent 1] INNER JOIN ([Liste domaines] INNER JOIN ([Liste Agents 2] INNER JOIN ([Etat d'avancement] INNER JOIN [Table générale] ON [Etat d'avancement].N° = [Table générale].[Etat d'avancement]) ON [Liste Agents 2].N° = [Table générale].[Agent 2]) ON [Liste domaines].N° = [Table générale].Domaine) ON [Listes Agent 1].N° = [Table générale].[Agent 1]
    WHERE ((([Listes Agent 1].[Prénom des agents])=IIf([Formulaires]![Copie de Menu2]![chkNoms],[Formulaires]![Copie de Menu2]![cmbRechNoms],[Listes Agent 1]![Prénom des agents])) AND (([Liste domaines].Domaine)=IIf([Formulaires]![Copie de Menu2]![chkDomaines],[Formulaires]![Copie de Menu2]![cmbRechDomaines],[Liste domaines]![Domaine])) AND (([Etat d'avancement].[Etat d'avancement])=IIf([Formulaires]![Copie de Menu2]![chkAvancement],[Formulaires]![Copie de Menu2]![cmbRechAvancement],[Etat d'avancement]![Etat d'avancement]))) OR ((([Table générale].[Travail en binome])=Yes) AND (([Liste Agents 2].[Prénom des agents])=[Formulaires]![Copie de Menu2]![cmbRechNoms]))
    ORDER BY [Liste domaines].Domaine;
    Merci à tous ceux qui ont pris le temps de s'intéresser à mon problème.

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/05/2015, 01h38
  2. Réponses: 2
    Dernier message: 08/06/2006, 06h29
  3. requêtes sql sur plusieurs tables
    Par zahiton dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 10h59
  4. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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