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 :

Formulaire de recherche multicritères


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut Formulaire de recherche multicritères
    Bonjour,

    J'ai créer un formulaire de recherche multicritères en suivant ce Tuto : http://cafeine.developpez.com/access...echerchemulti/

    Voici mon code final :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    Option Compare Database
     
    Private Sub chkNom_Click()
     
    If Me.chkNom Then
        Me.cmbNom.Visible = False
    Else
        Me.cmbNom.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
     
    Private Sub chkService_Click()
     
    If Me.chkService Then
        Me.cmbService.Visible = False
    Else
        Me.cmbService.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub chkFournisseur_Click()
     
    If Me.chkFournisseur Then
        Me.cmbFournisseur.Visible = False
    Else
        Me.cmbFournisseur.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub chkDate_Click()
     
    If Me.chkDate Then
        Me.txtDate.Visible = False
    Else
        Me.txtDate.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
     
    Private Sub cmbNom_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub cmbService_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub cmbFournisseur_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub txtDate_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    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 userName, nomService, fournisseur, dateEncodage FROM T_BonDeCommande, T_Users, T_Services, T_Fournisseurs WHERE userID=noAgent AND T_Services!noService=T_BonDeCommande!noService AND T_Fournisseurs!noFournisseur=T_BonDeCommande!noFournisseur;"
    Me.lstResults.Requery
     
    End Sub
     
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT userName, nomService, fournisseur, dateEncodage FROM T_BonDeCommande, T_Users, T_Services, T_Fournisseurs WHERE userID=noAgent AND T_Services!noService=T_BonDeCommande!noService AND T_Fournisseurs!noFournisseur=T_BonDeCommande!noFournisseur AND T_BonDeCommande!noBDC <> 0"
     
    If Not Me.chkNom Then
        SQL = SQL & "And T_Users!userName = '" & Me.cmbNom & "'"
    End If
    If Not Me.chkService Then
        SQL = SQL & "And T_Services!nomService = '" & Me.cmbService & "'"
    End If
    If Not Me.chkFournisseur Then
        SQL = SQL & "And T_Fournisseurs!fournisseur = '" & Me.cmbFournisseur & "'"
    End If
    If Not Me.chkDate Then
        SQL = SQL & "And T_BonDeCommande!dateEncodage like '*" & Me.txtDate & "*' "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    'Me.lblStats.Caption = DCount("*", "T_BonDeCommande", SQLWhere) & " / " & DCount("*", "noBDC")
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub
     
     
    'Private Sub lstResults_DblClick(Cancel As Integer)
    '
    'DoCmd.OpenForm "frmAutoMedias", acNormal, , "[CodMedia] = " & Me.lstResults
    '
    '
    'End Sub
    Et voici le résultat en image :
    Nom : access_recherche.jpg
Affichages : 397
Taille : 108,4 Ko

    J'ai cependant quelques soucis :

    Je ne comprends pas cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'Private Sub lstResults_DblClick(Cancel As Integer)
    '
    'DoCmd.OpenForm "frmAutoMedias", acNormal, , "[CodMedia] = " & Me.lstResults
    '
    '
    'End Sub
    Je ne l'utilise pas dans mon code et ne sachant pas à quoi ça sert...

    Actuellement, pour la date, je suis obliger de cliquer ailleurs après avoir choisis la date pour que les résultats s'actualise. Ceci est gérer par cette partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub txtDate_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
    Comment faire pour que ça s'actualise dès que l'on a choisis la date dans le petit calendrier ?

    Et dernière chose, mon label "lblStats" qui dois indiquer le nombre de résultats ne fonctionne pas, c'est pour cette raison que cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'Me.lblStats.Caption = DCount("*", "T_BonDeCommande", SQLWhere) & " / " & DCount("*", "noBDC")
    est en commentaire.

    Voici le message d'erreurs :

    Nom : access_recherche_err.jpg
Affichages : 315
Taille : 118,1 Ko

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour,
    Citation Envoyé par Almenor Voir le message
    Je ne comprends pas cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'Private Sub lstResults_DblClick(Cancel As Integer)
    '
    'DoCmd.OpenForm "frmAutoMedias", acNormal, , "[CodMedia] = " & Me.lstResults
    '
    '
    'End Sub
    DoCmd.OpenForm sert à ouvrir un formulaire. Ici ça cherche à ouvrir le formulaire frmAutoMedias avec comme critère "[CodMedia] = " & Me.lstResults

    Citation Envoyé par Almenor Voir le message
    Comment faire pour que ça s'actualise dès que l'on a choisis la date dans le petit calendrier ?
    Sur l’événement Change() de ton contrôle (Sur changement en FR).


    Citation Envoyé par Almenor Voir le message
    Et dernière chose, mon label "lblStats" qui dois indiquer le nombre de résultats ne fonctionne pas, c'est pour cette raison que cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'Me.lblStats.Caption = DCount("*", "T_BonDeCommande", SQLWhere) & " / " & DCount("*", "noBDC")
    est en commentaire.
    Normal, tu essaies de compter le nbre d'enregistrements dans une table qui n'existe pas (appremment tu n'as pas de table ni de requête qui s'appelle noBDC). A priori, tu devrais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.lblStats.Caption = DCount("*", "T_BonDeCommande", SQLWhere) & " / " & DCount("*", "T_BonDeCommande")
    Un peu d'efforts de recherche et tu aurais trouvé les réponses tout seul.....
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  3. #3
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par paidge Voir le message
    Bonjour,


    DoCmd.OpenForm sert à ouvrir un formulaire. Ici ça cherche à ouvrir le formulaire frmAutoMedias avec comme critère "[CodMedia] = " & Me.lstResults
    Ok, je comprends, ça ouvre un formulaire sur double-clic sur un des résultats de la recherche.


    Sur l’événement Change() de ton contrôle (Sur changement en FR).
    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub txtDate_Change()
     
    RefreshQuery
     
    End Sub
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub txtDate_Change(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
    Car je ne sais pas trop à quoi sert le cancel As Integer mais ça ne fonctionne pas :

    Nom : MIA4.jpg
Affichages : 305
Taille : 127,5 Ko

    Normal, tu essaies de compter le nbre d'enregistrements dans une table qui n'existe pas (appremment tu n'as pas de table ni de requête qui s'appelle noBDC). A priori, tu devrais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.lblStats.Caption = DCount("*", "T_BonDeCommande", SQLWhere) & " / " & DCount("*", "T_BonDeCommande")
    Un peu d'efforts de recherche et tu aurais trouvé les réponses tout seul.....
    J'ai fait quelques tests et le DCount("*", "T_BonDeCommande") fonctionne très bien et m'affiche 5 ce qui est juste.
    Donc le soucis vient du DCount("*", "T_BonDeCommande", SQLWhere) qui est censé afficher le nombres de bon de commande retourné avec application des filtres et là je cale...
    Le "userID" indiqué dans le message d'erreur (voir screen sur le premier post) est le nom du champ de la clé primaire de la table T_Users ou sont stockés les utilisateurs.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Citation Envoyé par Almenor Voir le message
    je ne sais pas trop à quoi sert le cancel As Integer
    Si dans la procédure, tu mets Cancel = True, ça annule l’événement.

    Citation Envoyé par Almenor Voir le message
    J'ai fait quelques tests et le DCount("*", "T_BonDeCommande") fonctionne très bien et m'affiche 5 ce qui est juste.
    Donc le soucis vient du DCount("*", "T_BonDeCommande", SQLWhere) qui est censé afficher le nombres de bon de commande retourné avec application des filtres et là je cale...
    Le "userID" indiqué dans le message d'erreur (voir screen sur le premier post) est le nom du champ de la clé primaire de la table T_Users ou sont stockés les utilisateurs.
    A mon avis, ta requête est mal écrite sur les lignes 100 et 109 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT userName, nomService, fournisseur, dateEncodage FROM T_BonDeCommande, T_Users, T_Services, T_Fournisseurs WHERE T_Users!userID=nomDeTable!noAgent AND T_Services!noService=T_BonDeCommande!noService AND T_Fournisseurs!noFournisseur=T_BonDeCommande!noFournisseur;
    nomDeTable est le nom de la table qui contient le champ noAgent
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  5. #5
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    J'ai fait les changements dans le SQL mais j'obtiens la même erreurs à la différence qu'au lieu d'avoir userID j'ai T_Users!userID

    Nom : MIA5.jpg
Affichages : 150
Taille : 13,4 Ko

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    En effet, comme tu ne fais pas de jointures (INNER JOIN) et que le nom de champ est (apparemment) unique, le nom de la table n'est pas nécessaire pour identifier le champ. Mais c'est bizarre du coup qu'il te génère une erreur (cela voudrait dire que le champ est manquant dans ta table ?!). Copies/colles ton code SQL dans le générateur de requête et passe en mode création/feuille de données pour voir les messages de Microsoft Jet
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  7. #7
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Oula ! Je suis totalement autodidacte et j'avoue n'avoir rien compris du tout à ta dernière phrase

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Le générateur de requêtes (parfois appelé QBE) est l'interface qui permet de créer des requêtes en mode graphique (en faisant des glisser/déposer sur les tables et les champs, etc.). On peut l'afficher en mode création (pour générer sa requête sans écrire de SQL), en mode SQL(pour créer sa requête directement en SQL) et en mode feuille de données (pour visualiser les résultats). Le moteur SQL dans Access s'appelle Microsoft Jet. En copiant/collant le code SQL dans le QBE (il faut obligatoirement l'afficher en mode SQL pour le coup), puis en passant en mode graphique (création ou feuille de données), le moteur SQL (Microsoft Jet) affichera un message d'erreur s'il y a lieu; car, pour le moment, ce sont des messages d'erreurs générés par le VBE (Visual Basic Editor) qui sont liés au VBA. Et ceux-ci ne sont pas suffisamment précis parfois pour identifier d'où vient le problème.
    En espérant avoir été clair...
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  9. #9
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Donc, si j'ai bien compris, j'ai lancé outil de création de requêtes que j'ai passé en mode SQL et j'y ai c/c mon code SQL :

    Nom : MIA6.jpg
Affichages : 252
Taille : 97,8 Ko

    Ensuite je repasse le tout en mode graphique :

    Nom : MIA7.jpg
Affichages : 293
Taille : 150,3 Ko

    Tout parait nickel et le résultat de la requête est bon :

    Nom : MIA8.jpg
Affichages : 221
Taille : 129,4 Ko

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    OK. Ce qui veut dire que ta requête est bien écrite
    Je pense donc que ton code plante quand tu tentes d'affecter ta requête à ta zone de liste. Sur quelle ligne as-tu cette erreur ?
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  11. #11
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Bon, j'ai contourné le problème en comptant directement le nombre de ligne dans la zone de liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.lblStats.Caption = lstResults.ListCount & " / " & DCount("*", "T_BonDeCommande")
    Sinon, l'erreur est sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.lblStats.Caption = DCount("*", "T_BonDeCommande", SQLWhere) & " / " & DCount("*", "T_BonDeCommande")
    Nom : MIA9.jpg
Affichages : 172
Taille : 158,7 Ko

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Je me doutais un peu que c'était sûrement ta variable SQLWhere qui était mal construite. Pour voir ce qu'elle te retourne, place un à la ligne 125. Tu pourras ajuster ton code en fonction
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

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

Discussions similaires

  1. [MySQL] Formulaire de Recherche Multicritères
    Par Meewix dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 24/11/2006, 21h27
  2. Réponses: 3
    Dernier message: 21/09/2006, 11h59
  3. Formulaire de recherche multicritère Access 2003
    Par Mimi64 dans le forum Access
    Réponses: 1
    Dernier message: 19/07/2006, 12h21
  4. Formulaire de recherche multicritères
    Par dolf13 dans le forum Langage
    Réponses: 10
    Dernier message: 20/06/2006, 23h24
  5. Formulaire de recherche multicritères
    Par Michel DELAVAL dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 09h32

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