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 :

Appliquer un filtre sur une fenêtre de résultats. [AC-2013]


Sujet :

Requêtes et SQL.

  1. #1
    Membre confirmé
    Avatar de vavavoum74
    Homme Profil pro
    Responsable magasin
    Inscrit en
    Mars 2018
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable magasin

    Informations forums :
    Inscription : Mars 2018
    Messages : 356
    Points : 572
    Points
    572
    Par défaut Appliquer un filtre sur une fenêtre de résultats.
    Bonjour
    Pardonnez moi d'avance , je débute et galère pour réaliser mon projet.
    Je suis à dispo si vous avez besoin de précisions..

    Je vais essayer de vous expliquer:
    j'ai essayé d'integrer ce tuto :http://cafeine.developpez.com/access...echerchemulti/
    dans une base que je construis.
    J'ai donc pris la base "originale" , créé un formulaire dans la mienne par copier coller, puis le code où j'ai remplacé le nom des champs et bases par les miens..

    Cela fonctionne grâce à l'aide reçue sur ce forum

    Voici le code à ce 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
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    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 NumeroOR, Nom, Telephone, TypeMachine , NomDuReparateur ,  FROM SuiviSAV;"
    Me.lstResults.Requery
     
    End Sub
     
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT NumeroOR, Nom, Telephone, TypeMachine , NomDuReparateur  FROM SuiviSAV Where SuiviSAV!NumeroOR <> 0 "
     
    If Not Me.chkNom Then
        SQL = SQL & "And SuiviSAV!Nom like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkTelephone Then
        SQL = SQL & "And SuiviSAV!Telephone = '" & Me.cmbRechTelephone & "' "
    End If
    If Not Me.chkTypeMachine Then
        SQL = SQL & "And SuiviSAV!TypeMachine like '*" & Me.txtRechTypeMachine & "*' "
    End If
    If Not Me.chkNomDuReparateur Then
        SQL = SQL & "And SuiviSAV!NomDuReparateur like '*" & Me.txtRechNomDuReparateur & "*' "
    End If
    If Not Me.chkNumeroOR Then
        SQL = SQL & "And SuiviSAV!NumeroOR =  " & Me.cmbRechNumeroOR & " "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    Me.lblStats.Caption = DCount("*", "SuiviSAV", SQLWhere) & " / " & DCount("*", "SuiviSAV")
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub
    Je souhaiterais avoir affiché toujours les mêmes 5 champs de résultat, avec comme condition ( les champs étant toujours contenus dans la même table "SuiviSAV" ):
    - la valeur [MontantDevis] est différente de zero et [DateDecision] vide , cela restreindrait l'affichage, une fois la case cochée aux devis en attente (il y a un montant de devis renseigné mais pas de décision prise (donc pas de date de décision))

    même chose pour les non expediés , càd [DateEnvoi] <> vide

    et pour les non revenus , càd [DateEnvoi] renseigné et [DateRetour] vide
    Je ne sais pas si je suis clair
    Pour reformuler, je souhaiterais que la liste des résultats soit encore restreinte par rapport aux critères ci dessus une fois la case correspondante cochée.
    J'ai ajouté 3 cases cochables sur mon formulaire: "chkDevisEnAttente" , "chkNonExpedies" et "chkNonRevenus"
    Je ne sais comment formuler ceci en SQL et où le mettre exactement.. et j'ai donc grandement besoin de vous

    Merci d'avance!

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Bonjour.

    La solution est une extension de ce que tu as déjà écrit :

    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 RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT NumeroOR, Nom, Telephone, TypeMachine , NomDuReparateur  FROM SuiviSAV Where SuiviSAV!NumeroOR <> 0 "
     
    If Not Me.chkNom Then
        SQL = SQL & "And SuiviSAV!Nom like '*" & Me.txtRechNom & "*' "
    End If
     
    If Not Me.chkTelephone Then
        SQL = SQL & "And SuiviSAV!Telephone = '" & Me.cmbRechTelephone & "' "
    End If
     
    If Not Me.chkTypeMachine Then
        SQL = SQL & "And SuiviSAV!TypeMachine like '*" & Me.txtRechTypeMachine & "*' "
    End If
     
    If Not Me.chkNomDuReparateur Then
        SQL = SQL & "And SuiviSAV!NomDuReparateur like '*" & Me.txtRechNomDuReparateur & "*' "
    End If
     
    If Not Me.chkNumeroOR Then
        SQL = SQL & "And SuiviSAV!NumeroOR =  " & Me.cmbRechNumeroOR & " "
    End If
     
    '=== Nouvelles contraintes
    if me.chkPasDecison then
        SQL = SQL & "And iif(isnull(SuiviSAV![MontantDevis]), 0, SuiviSAV![MontantDevis]) <> 0 and [DateDecision] IS NULL "
    end if
     
    if me.chkNonExpedie then
        SQL = SQL & "And SuiviSAV![DateEnvo] IS NULL " 'À mon avis tu as fait un erreur dans ton explication, si ce n'est pas envoyé il ne devrait pas y avoir de date d'expédition
    end if
     
    if me.chkNonRevenu then
        SQL = SQL & "And SuiviSAV![DateEnvoi] IS NOT NULL and SuiviSAV![DateRetour] IS NULL " 
    end if
    '--- Nouvelles contraintes
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    Me.lblStats.Caption = DCount("*", "SuiviSAV", SQLWhere) & " / " & DCount("*", "SuiviSAV")
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub
    Pour info les délimiteurs des valeurs changent selon le type de données :
    • Texte : Guillemet (") ou Apostrophe (')
    • Date : Dièse (#)
    • Autre : Pas de délimiteur


    Et la meilleur façon d'écrire du SQL dans Access c'est de le faire faire par Access en utilisant l'éditeur de requête.
    Grâce à cet outil, tu construits ta requêtes en quelques clics, glisser/déplacer et sélection dans des listes et/ou entrées directes dans les critères.
    Une fois que ta requête donne les résultats attendus, tu change l'affichage (en haut à gauche) pour SQL et tu regardes ce que Access a composé pour toi.
    Il est généralement assez simple ensuite de passer au VBA correspondant qui va reconstruire le SQL.

    A+

  3. #3
    Membre confirmé
    Avatar de vavavoum74
    Homme Profil pro
    Responsable magasin
    Inscrit en
    Mars 2018
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable magasin

    Informations forums :
    Inscription : Mars 2018
    Messages : 356
    Points : 572
    Points
    572
    Par défaut
    Merci de ton interêt

    Il faudrait que je me trouve une vidéo qui explique le fonctionnement de l’éditeur, je sois avouer que mes connaissances en SQL et VBA étant proches de zéro, j'avance un peu à l'aveuglette Et les tentatives que j'ai fait avec l’éditeur ce sont systématiquement soldées par de lamentables échecs...

    Revenons à nos moutons..

    J'ai tapé le code (tu avais raison pour les non expediés, ma faute )
    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
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT NumeroOR, Nom, Telephone, TypeMachine , NomDuReparateur  FROM SuiviSAV Where SuiviSAV!NumeroOR <> 0 "
     
    If Me.chkNom And (Me.cmbRechTelephone & "") <> "" Then
        SQL = SQL & "And SuiviSAV!Nom like '*" & Me.txtRechNom & "*' "
    End If
     
    If Me.chkTelephone And (Me.cmbRechTelephone & "") <> "" Then
        SQL = SQL & "And SuiviSAV!Telephone = '" & Me.cmbRechTelephone & "' "
    End If
     
    If Me.chkTypeMachine And (Me.txtRechTypeMachine & "") <> "" Then
        SQL = SQL & "And SuiviSAV!TypeMachine like '*" & Me.txtRechTypeMachine & "*' "
    End If
     
    If Me.chkNomDuReparateur And (Me.txtRechNomDuReparateur & "") <> "" Then
        SQL = SQL & "And SuiviSAV!NomDuReparateur like '*" & Me.txtRechNomDuReparateur & "*' "
    End If
     
    If Me.chkNumeroOR And (Me.cmbRechNumeroOR & "") <> "" Then
        SQL = SQL & "And SuiviSAV!NumeroOR = " & Me.cmbRechNumeroOR & " "
    End If
     
    If Me.chkDevisEnAttente Then
        SQL = SQL & "And iif(isnull(SuiviSAV![MontantDevis]), 0, SuiviSAV![MontantDevis]) <> 0 and [DateDecision] IS NULL "
    End If
     
    If Me.chkNonExpedies Then
        SQL = SQL & "And SuiviSAV![DateEnvoi] IS NULL "
    End If
     
    If Me.chkNonRevenus Then
        SQL = SQL & "And SuiviSAV![DateEnvoi] IS NOT NULL and SuiviSAV![DateRetour] IS NULL "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    Me.lblStats.Caption = DCount("*", "SuiviSAV", SQLWhere) & " / " & DCount("*", "SuiviSAV")
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub
    Et ça fonctionne!!!

    Merci pour l'info sur les séparateurs, je ne sais cependant pas si je dois en mettre et surtout où... mais je garde espoir, un jour ça viendra !

    Merci encore!

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Bonjour.

    Les délimteurs se mettent au début et à fin de la "chose" à définir.

    Ici un exemple dans ton code :

    "And SuiviSAV!Nom like '*" & Me.txtRechNom & "*' "

    Les 2 apostrophes délimitent *" & Me.txtRechNom & "* qui va être le modèle de ce qui est rechecher.
    Les apostrophes sont des délimiteurs pour le SQL et les guillemets sont les délimiteurs utilisés par VBA.
    Brefs tu as des délimiteurs définis entre d'autres délimiteurs ... ça peut devenir un peu compliqué mais on finit par attraper le coup.

    On a souvent besoin des délimiteurs quand on compose du SQL avec du code VBA et pour les paramètres de certaines fonction comme DFirst().
    Et leur abscence ou l'usage des mauvais délmiteurs entraîne souvant des erreurs qui laissent perplexe jsuqu'à ce qu'on réalise que cela vient de là.
    C'est pour cela que j'ai ajouté cette info.

    A+

  5. #5
    Membre confirmé
    Avatar de vavavoum74
    Homme Profil pro
    Responsable magasin
    Inscrit en
    Mars 2018
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable magasin

    Informations forums :
    Inscription : Mars 2018
    Messages : 356
    Points : 572
    Points
    572
    Par défaut
    Merci pour ces explications.

    Comme on dit, petit à petit l'oiseau fait son nid

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtres sur une fenêtre à partir de VB
    Par alexpat dans le forum Excel
    Réponses: 5
    Dernier message: 14/11/2013, 18h01
  2. Appliquer un filtre sur une colonne d'un DataGrid
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 24/05/2011, 13h42
  3. Afficher un résultat sur une fenêtre Excel.
    Par skon_ca dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2011, 19h09
  4. appliquer un filtre sur une image
    Par wahidred dans le forum Images
    Réponses: 3
    Dernier message: 09/12/2010, 12h33
  5. Réponses: 4
    Dernier message: 04/02/2008, 19h09

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