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

Requêtes et SQL. Discussion :

[A-03] Champs de recherche libre dans une zone de liste


Sujet :

Requêtes et SQL.

  1. #1
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut [A-03] Champs de recherche libre dans une zone de liste
    Bonjour, j'ai un formulaire avec une zone de liste qui reflete le contenu d'une table. Cette table est en fait une table de fournisseurs. Structure de la table (voir annexe)

    Dans mon formulaire, je voudrais avoir un champ libre qui me permette de filtrer le contenu de la zone de liste en fonction du nom de la société. Ce champs libre est en fait une txtBox, nomé comme suit : "txtRechFournisseur".

    Ce que je veut donc faire, c'est écrire par exemple "GAN" dans la txtBox, et que dans ma zone de liste, sa filtre les uniquement les fournisseurs commençant par "GAN"...

    J'ai donc placé le code suivant sur évenement Change de ma txtBox:

    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
    Private Sub txtRechFournisseur_Change()
     
    Dim valeur As String, debutSQL As String, finSQL As String, sql As String
    Dim listeRésultat As ListBox
     
       If Len(txtRechFournisseur.Text) > 0 Then
     
    sql = "SELECT tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété as [Nom de la société], tbl_Fournisseurs.NomDeLinterlocuteur as [Nom Interlocuteur], tbl_Fournisseurs.PrénomDeLinterlocuteur as [Prénom Interlocuteur], tbl_Fournisseurs.TelFixe as [Téléphone fixe], tbl_Fournisseurs.TelPortable as [Téléphone Portable], tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] as [E-mail] FROM tbl_Fournisseurs GROUP BY tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété, tbl_Fournisseurs.NomDeLinterlocuteur, tbl_Fournisseurs.PrénomDeLinterlocuteur, tbl_Fournisseurs.TelFixe, tbl_Fournisseurs.TelPortable, tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] WHERE (tbl_Fournisseurs.NomDeLaSociété like '" & txtRechFournisseur.Text & "*');"
     
            Me.listeRésultat.RowSource = sql
        Else
             RefreshQuery
        End If
     
    End Sub
    Mais sa ne fonctionne pas... Aurais-je fait une erreur?

    Merci de votre aide
    Images attachées Images attachées  

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 154
    Points : 148
    Points
    148
    Par défaut
    Bonsoir..

    Je crois que oui, tu as une erreur, voire plusieurs...

    Dans la chaine SQL, j'aurais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     & Me.txtRechFournisseur.Text
    Car txtRechFournisseur est le nom d'un contrôle du formulaire appelant...il faut lui dire ou aller chercher le contenu du controle, sur le formulaire...

    Le refresquery est une sub, je suppose..

    Dans ton cas, elle ne rafraichit rien, car tu l'as exclue du IF
    elle ne s'exécute que quand Len(txtRechFournisseur.Text) =0
    donc sans doute jamais...

    Voila quelques pistes..
    Bon courage

    Didier71

  3. #3
    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,

    Dans une instruction SQL SELECT, la clause WHERE précède la clause GROUP BY.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL = "SELECT tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété as [Nom de la société], tbl_Fournisseurs.NomDeLinterlocuteur as [Nom Interlocuteur], tbl_Fournisseurs.PrénomDeLinterlocuteur as [Prénom Interlocuteur], tbl_Fournisseurs.TelFixe as [Téléphone fixe], tbl_Fournisseurs.TelPortable as [Téléphone Portable], tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] as [E-mail] " & _
          "FROM tbl_Fournisseurs " & _
          "WHERE (tbl_Fournisseurs.NomDeLaSociété like '" & txtRechFournisseur.Text & "*') " & _
          "GROUP BY tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété, tbl_Fournisseurs.NomDeLinterlocuteur, tbl_Fournisseurs.PrénomDeLinterlocuteur, tbl_Fournisseurs.TelFixe, tbl_Fournisseurs.TelPortable, tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] ;"
    A+

  4. #4
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Salut les gars et merci pour votre aide, mais je ne pense pas que le souci vienne de là.

    Pour vous le démontrer, j'ai déja utilisé ce type de code dans un autre formulaire et sa marche parfaitement, voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub txtRéférence_Change()
    Dim valeur As String, debutSQL As String, finSQL As String, sql  As String
    Dim zoneListe As ListBox
     
       If Len(txtRéférence.Text) > 0 Then
     
    sql = "SELECT tbl_Référence.ID_Référence, IIF(tbl_Référence.CmdeAuto =true,""oui"",""non"") as [Cmde Auto], tbl_Désignation.Désignation, tbl_Référence.Référence, tbl_Référence.StockActuel as [Stock Actuel], tbl_Marques.Marque, tbl_Lignes.Designation as [Ligne] ,tbl_Machines.Designation as [Machine],  tbl_Lignes.Id_Ligne, tbl_Machines.Id_Machine, tbl_Désignation.ID_Désignation, tbl_Marques.ID_Marque FROM (tbl_Désignation INNER JOIN (tbl_Marques INNER JOIN tbl_Référence ON tbl_Marques.[ID_Marque] = tbl_Référence.[ID_Marque]) ON tbl_Désignation.[ID_Désignation] = tbl_Référence.[ID_Désignation]) INNER JOIN ((tbl_Lignes INNER JOIN tbl_Machines ON tbl_Lignes.[Id_Ligne] = tbl_Machines.[Id_Ligne]) INNER JOIN tbl_Nomenclature ON tbl_Machines.Id_Machine = tbl_Nomenclature.ID_Machine) ON tbl_Référence.ID_Référence = tbl_Nomenclature.ID_Référence WHERE (((tbl_Référence.ID_Référence)<>0)) and tbl_Référence.Référence like '" & txtRéférence.Text & "*';"
     
            Me.lstResults.RowSource = sql
        Else
             RefreshQuery
        End If
     
    End Sub
    Le code de mon RefreshQuery

    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
    Public Sub RefreshQuery()
    Dim sql As String, sqlCompteur As String
     
    Dim oRst As DAO.Recordset
    Dim odb As DAO.Database
    Set odb = CurrentDb
     
    sql = "SELECT tbl_Référence.ID_Référence, IIF(tbl_Référence.CmdeAuto =true,""oui"",""non"") as [Cmde Auto], tbl_Désignation.Désignation, tbl_Référence.Référence, tbl_Référence.StockActuel AS [Stock Actuel], tbl_Marques.Marque, tbl_Lignes.Designation AS [Ligne de production], tbl_Machines.Designation AS Machine, tbl_Lignes.Id_Ligne, tbl_Machines.Id_Machine, tbl_Désignation.ID_Désignation, tbl_Marques.ID_Marque, tbl_Emplacement.NomEmplacement FROM tbl_Emplacement INNER JOIN (tbl_Marques INNER JOIN (tbl_Désignation INNER JOIN (tbl_Référence INNER JOIN ((tbl_Lignes INNER JOIN tbl_Machines ON tbl_Lignes.Id_Ligne = tbl_Machines.Id_Ligne) INNER JOIN tbl_Nomenclature ON tbl_Machines.Id_Machine = tbl_Nomenclature.ID_Machine) ON tbl_Référence.ID_Référence = tbl_Nomenclature.ID_Référence) ON tbl_Désignation.ID_Désignation = tbl_Référence.ID_Désignation) ON tbl_Marques.ID_Marque = tbl_Référence.ID_Marque) ON tbl_Emplacement.ID_Emplacement = tbl_Référence.ID_Emplacement WHERE tbl_Référence.ID_Référence<>0"
     
    If Not IsNull(Me.cmbRechLigne) Then
        sql = sql & " and tbl_Machines.Id_Ligne =  " & Me.cmbRechLigne & " "
    End If
     
    If Me.cmbRechMachine <> "" Then
        sql = sql & " and tbl_Nomenclature.ID_Machine = " & Me.cmbRechMachine & " "
    End If
     
    If Me.cmdRechCat <> "" Then
        sql = sql & " and tbl_Désignation.ID_Catégorie =  " & Me.cmdRechCat & "  "
    End If
     
    sqlCompteur = "select count(*) from (" & sql & ");"
    Set oRst = odb.OpenRecordset(sqlCompteur, dbOpenDynaset)
    Me.txtNombreLigneCritéres.Caption = oRst.Fields(0).value
     
    sqlCompteur = "select count(*) from( select * from tbl_Référence);"
    Set oRst = odb.OpenRecordset(sqlCompteur, dbOpenDynaset)
    Me.txtNombreLignetotal.Caption = oRst.Fields(0).value
     
    Me.lstResults.RowSource = sql
    Me.lstResults.Requery
     
    End Sub

  5. #5
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Donc là pour ce formulaire mise à part les appels de formulaires différents, je ne voit pas se que j'ai changé et donc pourquoi sa ne fonctionne pas?!

    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
    Private Sub txtRechFournisseur_Change()
     
    Dim valeur As String, debutSQL As String, finSQL As String, sql As String
    Dim listeRésultat As ListBox
     
       If Len(txtRechFournisseur.Text) > 0 Then
     
    sql = "SELECT tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété as [Nom de la société], tbl_Fournisseurs.NomDeLinterlocuteur as [Nom Interlocuteur], tbl_Fournisseurs.PrénomDeLinterlocuteur as [Prénom Interlocuteur], tbl_Fournisseurs.TelFixe as [Téléphone fixe], tbl_Fournisseurs.TelPortable as [Téléphone Portable], tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] as [E-mail] FROM tbl_Fournisseurs GROUP BY tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété, tbl_Fournisseurs.NomDeLinterlocuteur, tbl_Fournisseurs.PrénomDeLinterlocuteur, tbl_Fournisseurs.TelFixe, tbl_Fournisseurs.TelPortable, tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] WHERE (tbl_Fournisseurs.NomDeLaSociété like '" & txtRechFournisseur.Text & "*');"
     
            Me.listeRésultat.RowSource = sql
        Else
             RefreshQuery
        End If
     
    End Sub
    Mon refreshQuery

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub RefreshQuery()
    Dim sql As String
    Dim oRst As DAO.Recordset
    Dim odb As DAO.Database
    Set odb = CurrentDb
     
    sql = "SELECT tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété as [Nom de la société], tbl_Fournisseurs.NomDeLinterlocuteur as [Nom Interlocuteur], tbl_Fournisseurs.PrénomDeLinterlocuteur as [Prénom Interlocuteur], tbl_Fournisseurs.TelFixe as [Téléphone fixe], tbl_Fournisseurs.TelPortable as [Téléphone Portable], tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] as [E-mail] FROM tbl_Fournisseurs GROUP BY tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété, tbl_Fournisseurs.NomDeLinterlocuteur, tbl_Fournisseurs.PrénomDeLinterlocuteur, tbl_Fournisseurs.TelFixe, tbl_Fournisseurs.TelPortable, tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail]"
     
    Me.listeRésultat.RowSource = sql
    Me.listeRésultat.Requery
    End Sub

  6. #6
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    bonjour,
    1er est-ce que ta listebox fonctionne sans le code de mise à jour?
    2ème si c'est le cas ajoute le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Me.listeRésultat.RowSource = sql
                      Me.listeRésultat.requery ' code à rajouter
                else...
    bonne chance

  7. #7
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Bonjour et merci, mais sa ne fonctionne pas non plus... Je n'avais pas d'évenement sur mise à jour.

    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
    Private Sub txtRechFournisseur_Change()
     
    Dim valeur As String, debutSQL As String, finSQL As String, sql As String
    Dim listeRésultat As ListBox
     
       If Len(txtRechFournisseur.Text) > 0 Then
     
    sql = "SELECT tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété as [Nom de la société], tbl_Fournisseurs.NomDeLinterlocuteur as [Nom Interlocuteur], tbl_Fournisseurs.PrénomDeLinterlocuteur as [Prénom Interlocuteur], tbl_Fournisseurs.TelFixe as [Téléphone fixe], tbl_Fournisseurs.TelPortable as [Téléphone Portable], tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] as [E-mail] FROM tbl_Fournisseurs GROUP BY tbl_Fournisseurs.ID_Fournisseur, tbl_Fournisseurs.NomDeLaSociété, tbl_Fournisseurs.NomDeLinterlocuteur, tbl_Fournisseurs.PrénomDeLinterlocuteur, tbl_Fournisseurs.TelFixe, tbl_Fournisseurs.TelPortable, tbl_Fournisseurs.Fax, tbl_Fournisseurs.[E-mail] WHERE (tbl_Fournisseurs.NomDeLaSociété like '" & txtRechFournisseur.Text & "*');"
     
            Me.listeRésultat.RowSource = sql
            Me.listeRésultat.Requery
        Else
             RefreshQuery
        End If
     
    End Sub

  8. #8
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    Bonjour,
    si cela ne fonctionne toujours pas je te conseille de tester d'abord ta liste box!
    1° vérifie que la liste box affiche bien ce que tu veux sans le filtre.
    2° si la liste box fonctionne correctement tu vas dans le générateur de requête de la liste box et là tu mets tape "CAN" dans les critères du champs que tu recherches en l'occurrence chez toi le champ "NomDeLaSociété"
    3° tu clique dans le bouton pour afficher ta requête en mode SQL
    4° tu copie la requête SQL et tu la copie dans ton code VBA et il te suffit de modifier le like CAN en "" & txtRéférence.Text &"
    5° si çà ne fonctionne pas fait en débug en affichant ta requête Sql avec un msgbox (sql)

    6° d'autre part je ne sais si çà joue un rôle mais ne nomme pas des variables par sql (c'est un mot réservé) mais plutôt SqlStr par exemple

    bonne chance

  9. #9
    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,

    Je persiste à croire que WHERE doit être avant GROUP BY.
    Cf syntaxe instruction SELECT

    A+

  10. #10
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    @LedZeppII : Tu as tout à fait raison...

    @moilou2 : Il est normale que le 2ème code que tu fournis fonctionne car il n'y a pas de GROUP BY dans ta requête.

    Si tu veux opérer le regroupement avant les critères, il faudra mettre HAVING après le GROUP BY et non WHERE...




    PS: 30 secondes auraient suffit pour vérifier au moins les dire de @LedZeppII, plutôt que de répondre par un "je ne pense pas"..!


Discussions similaires

  1. Réponses: 1
    Dernier message: 09/06/2015, 20h56
  2. Réponses: 3
    Dernier message: 11/07/2007, 10h10
  3. Réponses: 2
    Dernier message: 26/04/2007, 11h52
  4. Réponses: 3
    Dernier message: 21/09/2006, 11h59
  5. Afficher un champ de la BD dans une zone de texte
    Par uloaccess dans le forum Access
    Réponses: 3
    Dernier message: 25/11/2005, 23h38

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