Problème SQL

Anddreaa Messages postés 11 Statut Membre -  
Anddreaa Messages postés 11 Statut Membre -
Bonjour,

J'ai une grosse base de données sur ACCESS que nous avons créer pour notre association. Je fais des mises à jour depuis plusieurs semaines et voilà que je bloque sur un SQL pour le formulaire de base.

J'explique :
- Quand on ouvre la base, on arrive sur un formulaire où l'on peut rechercher par NOM, PRENOM, RUBRIQUE, DOSSIER et ORGANISATION. Tout ces critères sont liés à ma table "identification" qui reprends tous les éléments dont on a besoin quand un nouveau membre ou autre s'inscrit dans notre association. Le critère RUBRIQUE est une liste de choix à plusieurs valeurs (RUBRIQUE.VALUE), je pense que c'est cela qui pose problème... Mais j'ai beau retourner le problème dans tout les sens j'ai toujours un message d'erreur. (je joins une photo de comment ça se présente pour aider :
).

Le but du formulaire est de pouvoir filtrer rapidement pour mes collègues sans passer par un listing ou autres. Il faut que ça reste très simple pour eux..

- Une procédure événementielle est donc liée à chaque bouton de recherche. Voici ma dernière SQL encodée :
" Option Compare Database
Option Explicit

Private Sub boutoncompta_Click()

End Sub

Private Sub chkDossier_Click()

If Me.chkDossier Then
Me.txtRechDossier.Visible = False
Else
Me.txtRechDossier.Visible = True
End If

RefreshQuery

End Sub

Private Sub chkNom_Click()

If Me.chkNom Then
Me.txtRechNom.Visible = False
Else
Me.txtRechNom.Visible = True
End If

RefreshQuery

End Sub

Private Sub chkOrganisation_Click()

If Me.chkOrganisation Then
Me.txtRechOrganisation.Visible = False
Else
Me.txtRechOrganisation.Visible = True
End If

RefreshQuery

End Sub

Private Sub chkPrenom_Click()

If Me.chkPrenom Then
Me.txtRechPrenom.Visible = False
Else
Me.txtRechPrenom.Visible = True
End If

RefreshQuery

End Sub

Private Sub chkRubrique_Click()

If Me.chkRubrique Then
Me.cmbRechRubrique.Visible = False
Else
Me.cmbRechRubrique.Visible = True
End If

RefreshQuery

End Sub

Private Sub cmbRechRubrique_BeforeUpdate(Cancel As Integer)

RefreshQuery

End Sub

Private Sub chkRubrique_Click()

End Sub

Private Sub Form_Load()

Dim ctl As Control

For Each ctl In Me.Controls
Select Case Left(ctl.Name, 3)
Case "chk"
ctl.Value = -1

Case "lbl"
ctl.Caption = "- * - * -"

Case "txt"
ctl.Visible = False
ctl.Value = ""

Case "cmb"
ctl.Visible = False

End Select
Next ctl

Me.lstResults.RowSource = "SELECT N°, Nom, Prénom, Rubrique.value, Organisation, Dossier, Tel, Mail FROM [1 Identification] ORDER BY [1 Identification].Nom;"
Me.lstResults.Requery

End Sub

Private Sub RefreshQuery()
Dim SQL As String
Dim SQLWhere As String

SQL = "SELECT N°, Nom, Prénom, Rubrique.value, Organisation, Dossier, Tel, Mail FROM [1 Identification] Where [1 Identification]!N° > 0"

If Not Me.chkNom Then
SQL = SQL & "And [1 Identification]!Nom like '*" & Me.txtRechNom & "*' "
End If
If Not Me.chkPrenom Then
SQL = SQL & "And [1 Identification]!Prénom like '*" & Me.txtRechPrenom & "*' "
End If
If Not Me.chkOrganisation Then
SQL = SQL & "And [1 Identification]!Organisation like '*" & Me.txtRechOrganisation & "*' "
End If
If Not Me.chkDossier Then
SQL = SQL & "And [1 Identification]!Dossier like '*" & Me.txtRechDossier & "*' "
End If
If Not Me.chkRubrique Then
SQL = SQL & "And [1 Identification]!Rubrique = '*" & Me.cmbRechRubrique & "*' "
End If

SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))

SQL = SQL & ";"

Me.lblStats.Caption = DCount("*", "[1 Identification]", SQLWhere) & " / " & DCount("*", "[1 Identification]")
Me.lstResults.RowSource = SQL
Me.lstResults.Requery

End Sub

Private Sub lstResults_DblClick(Cancel As Integer)

DoCmd.OpenForm "Formulaire MEMBRES", acNormal, , "[N°] = " & Me.lstResults, , acDialog

End Sub

Private Sub txtRechDossier_BeforeUpdate(Cancel As Integer)

RefreshQuery

End Sub

Private Sub txtRechNom_BeforeUpdate(Cancel As Integer)

RefreshQuery

End Sub

Private Sub txtRechOrganisation_BeforeUpdate(Cancel As Integer)

RefreshQuery

End Sub

Private Sub txtRechPrenom_BeforeUpdate(Cancel As Integer)

RefreshQuery

End Sub
"

J'espère que quelqu'un saura m'aider, ça fait 2 semaines que je cherche à résoudre ce problème et que je me tire les cheveux... ^^
Je sens que la réponse est sous mes yeux.. x)

Un grand merci par avance à qui saura m'aider !! :D

Configuration: Windows / Chrome 85.0.4183.83

5 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    merci d'utiliser les balises de code, en précisant basic, quand tu partages du VBA: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    tu ne décris pas ton soucis. as-tu un message d'erreur, ou un résultat inattendu?
    as-tu testé à la main la requête SQL pour obtenir une requête qui fonctionne?
    peut-être le soucis est-il ici:
    SQL = SQL & "And [1 Identification]!Rubrique = '*" & Me.cmbRechRubrique & "*' "

    comme tu n'utilises pas like, il n'y a pas lieu d'utiliser les *.
    ce serait donc peut-être:
    SQL = SQL & "And [1 Identification]!Rubrique = '" & Me.cmbRechRubrique & "' "

    par ailleurs, je suis surpris de ton utilisation des points d'exclamations dans la requête SQL. de plus, comme il n'y a qu'une table, il n'est pas utile d'en spécifier le nom.
    donc je ferais:
    SQL = SQL & " And Rubrique = '" & Me.cmbRechRubrique & "' "
    0
    1. Anddreaa Messages postés 11 Statut Membre
       
      Bonjour,
      Tout d'abord, désolé pour les codes c'est la première fois que je poste sur le forum je ferais attention la prochaine fois.. Je peux les repartager en commentaire pour plus de lisibilité.

      Pour les points d'exclamations, il est vrai qu'ils ne sont pas nécessaire je pensais devoir mettre un indicateur pour qu'il n'y est pas de problème lors de l'exécution.

      Mon problème est spécifié : j'ai eu plusieurs messages d'erreurs, et le bouton "recherche par rubrique" ne fonctionne plus. Voici le message qui s'affiche : "Le champ à plusieurs valeurs <<[1 Identification]!Rubrique>> ne peut pas être utilisé dans une clause WHERE ou HAVING."

      J'ai testé ce que vous me conseillez mais le soucis reste le même.

      Par ailleurs, ma base contient 6 bases liées les unes aux autres. Ce formulaire (photo jointe dans ma demande) ne dépend que de ma table "1 identification". Le problème avec les messages d'erreurs est apparu lorsque j'ai changé le format de mon champ "rubrique" en liste de choix à plusieurs valeurs (contenues dans "rubrique.value").
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Anddreaa Messages postés 11 Statut Membre
       
      bien, tu donnes, finalement, le message d'erreur.
      quand tu écris "ma base contient 6 bases", veux-tu écrire "ma base contient 6 tables"?
      je recommande de tester les requêtes SQL à la main, hors VBA, pour determiner la syntaxe correcte.
      pourrais-tu partager ton fichier, pour que nous puissions examiner comment tu as créé le champ "rubrique"?
      sinon, crée une requête avec un critère sur la valeur du champ rubrique, et, quand elle fonctionne, examine la syntaxe SQL de cette requête. cela t'aidera peut-être.
      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      peux-être, tout simplement:
      " And Rubrique.value = '" & Me.cmbRechRubrique & "' " 
      0
    4. Anddreaa Messages postés 11 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour,
      Oui je voulais bien dire "tables"...
      J'ai testé en créant une requête avec un critère sur mon champ rubrique, pensant trouver mon erreur j'ai donc appliqué le critère dans ma SQL mais ça ne fonctionne toujours pas.
      Voici le lien pour accéder à ma base de données : base de données supprimée par la Modération CCM semble contenir des données confidentielles, ne prendre en compte que les relations qui existent déjà et ne pas faire attention au reste. Elle est en cours de nettoyage pour la rendre moins lourde et plus intuitive.
      Merci pour l'aide.
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Anddreaa Messages postés 11 Statut Membre
       
      et donc il est autorisé de sélectionner plusieurs rubriques pour un même enregistrement, c'est bien cela que tu souhaites? je ne vois aucun cas dans la table, donc je me demande...
      0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    pour simplifier, et éviter des soucis si "Where" est présent dans un critère de recherche, au lieu de
    SQL = "SELECT N°, Nom, Prénom, Rubrique.value, Organisation, Dossier, Tel, Mail FROM [1 Identification] Where [1 Identification]!N° > 0"
    
    If Not Me.chkNom Then
    SQL = SQL & "And [1 Identification]!Nom like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkPrenom Then
    SQL = SQL & "And [1 Identification]!Prénom like '*" & Me.txtRechPrenom & "*' "
    End If
    If Not Me.chkOrganisation Then
    SQL = SQL & "And [1 Identification]!Organisation like '*" & Me.txtRechOrganisation & "*' "
    End If
    If Not Me.chkDossier Then
    SQL = SQL & "And [1 Identification]!Dossier like '*" & Me.txtRechDossier & "*' "
    End If
    If Not Me.chkRubrique Then
    SQL = SQL & "And [1 Identification]!Rubrique = '*" & Me.cmbRechRubrique & "*' "
    End If
    
    
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
    
    SQL = SQL & ";"

    je ferais ainsi:
    SQL = "SELECT N°, Nom, Prénom, Rubrique.value, Organisation, Dossier, Tel, Mail FROM [1 Identification] "
    SQLWhere = " true "
    If Not Me.chkNom Then
        SQLWhere = SQLWhere & "And [1 Identification]!Nom like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkPrenom Then
        SQLWhere = SQLWhere & "And [1 Identification]!Prénom like '*" & Me.txtRechPrenom & "*' "
    End If
    If Not Me.chkOrganisation Then
        SQLWhere = SQLWhere & "And [1 Identification]!Organisation like '*" & Me.txtRechOrganisation & "*' "
    End If
    If Not Me.chkDossier Then
        SQLWhere = SQLWhere & "And [1 Identification]!Dossier like '*" & Me.txtRechDossier & "*' "
    End If
    If Not Me.chkRubrique Then
        SQLWhere = SQLWhere & "And [1 Identification]!Rubrique = '*" & Me.cmbRechRubrique & "*' "
    End If
    SQL = SQL & " where " & SQLWhere
    
    0
    1. Anddreaa Messages postés 11 Statut Membre
       
      Option Compare Database
      Option Explicit
      
      Private Sub boutoncompta_Click()
      
      End Sub
      
      Private Sub chkDossier_Click()
      
      If Me.chkDossier Then
          Me.txtRechDossier.Visible = False
      Else
          Me.txtRechDossier.Visible = True
      End If
       
      RefreshQuery
      
      End Sub
      
      Private Sub chkNom_Click()
       
      If Me.chkNom Then
          Me.txtRechNom.Visible = False
      Else
          Me.txtRechNom.Visible = True
      End If
       
      RefreshQuery
       
      End Sub
      
      Private Sub chkOrganisation_Click()
      
      If Me.chkOrganisation Then
          Me.txtRechOrganisation.Visible = False
      Else
          Me.txtRechOrganisation.Visible = True
      End If
       
      RefreshQuery
      
      End Sub
      
      Private Sub chkPrenom_Click()
       
      If Me.chkPrenom Then
          Me.txtRechPrenom.Visible = False
      Else
          Me.txtRechPrenom.Visible = True
      End If
       
      RefreshQuery
       
      End Sub
      
      
      Private Sub chkRubriqueGénérale_Click()
      
      If Me.chkRubriqueGénérale Then
          Me.cmbRechRubrique.Visible = False
      Else
          Me.cmbRechRubrique.Visible = True
      End If
       
      RefreshQuery
       
      End Sub
      
      Private Sub cmbRechRubrique_BeforeUpdate(Cancel As Integer)
      
      RefreshQuery
      
      End Sub
      
      Private Sub chkRubrique_Click()
      
      End Sub
      
      Private Sub Form_Load()
       
      Dim ctl As Control
       
      For Each ctl In Me.Controls
          Select Case Left(ctl.Name, 3)
              Case "chk"
                  ctl.Value = -1
       
              Case "lbl"
                  ctl.Caption = "- * - * -"
       
              Case "txt"
                  ctl.Visible = False
                  ctl.Value = ""
                              
              Case "cmb"
                  ctl.Visible = False
       
          End Select
      Next ctl
        
      Me.lstResults.RowSource = "SELECT N°, Nom, Prénom, Rubrique.value, Organisation, Dossier, Tel, Mail FROM [1 Identification] ORDER BY [1 Identification].Nom;"
      Me.lstResults.Requery
      
      End Sub
      
      Private Sub RefreshQuery()
      Dim SQL As String
      Dim SQLWhere As String
       
      SQL = "SELECT N°, Nom, Prénom, Rubrique.value, Organisation, Dossier, Tel, Mail FROM [1 Identification] "
      SQLWhere = " true "
      If Not Me.chkNom Then
          SQL = SQL & "And [1 Identification].Nom = '" & Me.txtRechNom & "' "
      End If
      If Not Me.chkPrenom Then
          SQL = SQL & "And [1 Identification].Prénom = '" & Me.txtRechPrenom & "' "
      End If
      If Not Me.chkOrganisation Then
          SQL = SQL & "And [1 Identification].Organisation = '" & Me.txtRechOrganisation & "' "
      End If
      If Not Me.chkDossier Then
          SQL = SQL & "And [1 Identification].Dossier = '" & Me.txtRechDossier & "' "
      End If
      If Not Me.chkRubrique Then
          SQL = SQL & "And [1 Identification].Rubrique = '" & Me.cmbRechRubrique & "' "
      End If
      SQL = SQL & " where " & SQLWhere
       
      Me.lblStats.Caption = DCount("*", "[1 Identification]", SQLWhere) & " / " & DCount("*", "[1 Identification]")
      Me.lstResults.RowSource = SQL
      Me.lstResults.Requery
       
      End Sub
      
      Private Sub lstResults_DblClick(Cancel As Integer)
       
      DoCmd.OpenForm "Formulaire MEMBRES", acNormal, , "[N°] = " & Me.lstResults, , acDialog
       
      End Sub
      
      Private Sub txtRechDossier_BeforeUpdate(Cancel As Integer)
      
      RefreshQuery
      
      End Sub
      
      Private Sub txtRechNom_BeforeUpdate(Cancel As Integer)
      
      RefreshQuery
      
      End Sub
      
      Private Sub txtRechOrganisation_BeforeUpdate(Cancel As Integer)
      
      RefreshQuery
      
      End Sub
      
      Private Sub txtRechPrenom_BeforeUpdate(Cancel As Integer)
      
      RefreshQuery
      
      End Sub
      0
  3. RV71 Messages postés 620 Date d'inscription   Statut Membre Dernière intervention   31
     
    Bonjour,

    j'ai une base où je filtre des listes de choix avec plusieurs valeurs possible, voici une partie du code si tu veux t'en inspirer.
     Dim varI As Variant 'on  déclare une variable de type variant, donc peut être de n'importe quel type
    
      Dim strFiltre As String 'on dit que le filtre global sera une chaine de caracteres alphanum
      
     
      strFiltre = "" 'au départ, on dit que le filtre global ne contient rien, donc, on ne filtre rien
      
      
      
              
    
    If Me.listetype.ItemsSelected.Count = 0 Then 'on regarde la liste de type, si on n'a pas sélectionné (=0)
        'on passe à la section suivante avec goto....
            GoTo section_statuts
    
            
    Else 'sinon, cela veut dire qu'il  a au moins un élément de la liste sélectionné
        For Each varI In Me!listetype.ItemsSelected 'pour chaque élément sélectionné dans la liste -->
            If strFiltre_Type <> "" Then strFiltre_Type = strFiltre_Type & " OR " 'si ce n'est pas le premier élément du filtre, on rajoute l'élément sélectionné avec un "OR" pour la suite de la boucle
                strFiltre_Type = strFiltre_Type & "([Lookup_type].[type]=" & "'" & Me!listetype.ItemData(varI) & "'" & ")"
            
        Next varI  'on boucle chaque élément de la liste
    
    strFiltre = strFiltre & "(" & strFiltre_Type & ")"
        
        
        
    End If
    


    A+
    0
    1. Anddreaa Messages postés 11 Statut Membre
       
      Bonjour,
      Merci beaucoup.
      Ce code est utilisé dans un formulaire de recherche ? Car j'arrive à filtrer quand j'insère des requêtes ou des formulaires pour avoir des listings, mon soucis est vraiment dans mon formulaire de base, quand je veux afficher tous les membres par rubrique.
      Ex: je souhaite avoir rapidement l’œil sur les membres faisant partis de ma rubrique "famille". A côté de "recherche par rubrique" je dois avoir une liste déroulante avec toutes mes rubriques et je devrais pouvoir cliquer sur "famille" puis lancer la recherche afin d'avoir tout mes membres "famille"...
      Ça fonctionne parfaitement avec "nom", "prénom", ... Je ne comprends pas.
      0
  4. RV71 Messages postés 620 Date d'inscription   Statut Membre Dernière intervention   31
     
    Bonjour,
    oui c'est une partie du code d'un formulaire de recherche multi critères

    J'ai mis ici le code qui filtre sur une zone de liste à choix multiples, il y en a une dizaine dans le form.

    strfiltre est donc au final la clause WHERE et est incrémenté par les différentes zones de liste.
    Pour récupérer les valeurs sélectionnées dans la zone de liste "Listetype" (son nom dans mon formulaire) je boucle sur la propriété .ItemData de cette zone.

    A+
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    cela fonctionne ainsi:
    SQLWhere = SQLWhere & "And [1 Identification].Rubrique.Value = '" & Me.cmbRechRubrique & "' "

    j'ai supprimé le test sur Me.chkRubrique, je ne vois pas trop à quoi il sert.
    j'ai aussi changé la requête utilisée pour peupler la liste des rubriques:
    SELECT distinct [1 Identification].Rubrique.Value FROM [1 Identification] ;

    il y a peut-être moyen de faire autrement et mieux.
    difficile de déterminer cela, j'ai l'impression qu'il y a beaucoup de manquements et d'hésitations dans la base.
    0
    1. Anddreaa Messages postés 11 Statut Membre
       
      Je vais tester, merci !!
      0