Problème SQL

Fermé
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020 - Modifié le 2 sept. 2020 à 11:11
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020 - 3 sept. 2020 à 18:12
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
A voir également:

5 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
2 sept. 2020 à 13:38
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
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020
2 sept. 2020 à 14:36
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
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020
Modifié le 2 sept. 2020 à 16:25
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
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
2 sept. 2020 à 16:35
peux-être, tout simplement:
" And Rubrique.value = '" & Me.cmbRechRubrique & "' " 
0
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
Modifié le 3 sept. 2020 à 17:39
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
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020
3 sept. 2020 à 15:01
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
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
2 sept. 2020 à 13:49
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
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020
Modifié le 2 sept. 2020 à 14:45
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
RV71 Messages postés 509 Date d'inscription mardi 14 avril 2020 Statut Membre Dernière intervention 15 avril 2024 31
Modifié le 2 sept. 2020 à 17:46
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
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020
3 sept. 2020 à 14:27
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
RV71 Messages postés 509 Date d'inscription mardi 14 avril 2020 Statut Membre Dernière intervention 15 avril 2024 31
3 sept. 2020 à 14:33
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
3 sept. 2020 à 15:44
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
Anddreaa Messages postés 11 Date d'inscription mercredi 2 septembre 2020 Statut Membre Dernière intervention 3 septembre 2020
3 sept. 2020 à 16:10
Je vais tester, merci !!
0