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

Access Discussion :

Formulaire de recherche multicriteres par cafeine


Sujet :

Access

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Formulaire de recherche multicriteres par cafeine
    Bonjour a tous

    Debutant en VBA, je rencontre un probleme sur le formulaire de recherche multicriteres dynamique inspire du tuto de cafeine. (merci pour ce tuto)

    J'ai une base de donnees qui regroupe des commandes prises aupres de clients (Champs : Ref, Clients, Date, taille, poids, prix unitaire, total, etc...). Le but de cette base de donnees est de pouvoir extraire des donnees en fonction de plusieurs criteres simultanes bien precis.

    Apres un quasi plagiat de l'exemple fait par cafeine, j'obtiens un formulaire qui marche presque parfaitement.... sauf quand je veux definir un critere au niveau des dates.
    J'ai deux champs date dans mon formulaire de recherche multicriteres: "Date depart" et "date de fin".
    J'aimerais pouvoir obtenir
    - les donnees ulterieures a ma "date depart"
    - les donnees precedentes a ma "date de fin"
    - les donnees comprises entre "date depart" et "date de fin"

    En VBA j'ai ecrit ca mais ca a pas l'air de fonctionner (seules les dates posent probleme... les autres criteres marchent correctement)
    ----------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL = "SELECT ID, REF, CUSTOMER, GROUP, MARKET, REP, QUOTEDATE, GRADE, SHAPE, SIZEINMM, WEIGHT, ORDER FROM R_RECHERCHE Where R_RECHERCHE!ID <> 0"
     
    If Not Me.CHKSTARTDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE >= ' " & Format(Me.TXTSTARTDATE, "dd/mm/yyyy") & " ' "
    End If
    If Not Me.CHKENDDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE <= ' " & Format(Me.TXTENDDATE, "dd/mm/yyyy") & " ' "
    End If
    -----------------------------------------

    Pour info:
    Quand je clique sur les cases a cocher afin d'activer les criteres "date depart", "date de fin" le debugger surligne la ligne suivante en jaune
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.LBLSTATS.Caption = DCount("*", "R_RECHERCHE", SQLWhere) & " / " & DCount("*", "R_RECHERCHE")
    Voila.... si quelqu'un peut m'aider svp....

    Merci





    Pour plus de detail voici le mode VBA de mon formulaire de recherche
    ---------------------------------------------------------------------------------
    Option Compare Database

    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    Private Sub CHKSTARTDATE_Click()
    If Me.CHKSTARTDATE Then
    Me.TXTSTARTDATE.Visible = False
    Else
    Me.TXTSTARTDATE.Visible = True
    End If
     
    End Sub
     
    Private Sub CHKENDDATE_Click()
     
    If Me.CHKENDDATE Then
        Me.TXTENDDATE.Visible = False
    Else
        Me.TXTENDDATE.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKREF_Click()
     
    If Me.CHKREF Then
        Me.TXTREF.Visible = False
    Else
        Me.TXTREF.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKCUSTOMER_Click()
     
    If Me.CHKCUSTOMER Then
        Me.CMBCUSTOMER.Visible = False
    Else
        Me.CMBCUSTOMER.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKREP_Click()
     
    If Me.CHKREP Then
        Me.CMBREP.Visible = False
    Else
        Me.CMBREP.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKGRADE_Click()
     
    If Me.CHKGRADE Then
        Me.CMBGRADE.Visible = False
    Else
        Me.CMBGRADE.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKGROUP_Click()
     
    If Me.CHKGROUP Then
        Me.CMBGROUP.Visible = False
    Else
        Me.CMBGROUP.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKMARKET_Click()
     
    If Me.CHKMARKET Then
        Me.CMBMARKET.Visible = False
    Else
        Me.CMBMARKET.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
     
    Private Sub CHKORDER_Click()
     
    If Me.CHKORDER Then
        Me.CMBORDER.Visible = False
    Else
        Me.CMBORDER.Visible = True
    End If
     
    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 ID, REF, CUSTOMER, GROUP, MARKET, REP, QUOTEDATE, GRADE, SHAPE, SIZEINMM, WEIGHT, ORDER FROM R_RECHERCHE;"
    Me.LSTRESULTS.Requery
     
    End Sub
     
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT ID, REF, CUSTOMER, GROUP, MARKET, REP, QUOTEDATE, GRADE, SHAPE, SIZEINMM, WEIGHT, ORDER FROM R_RECHERCHE Where R_RECHERCHE!ID <> 0"
     
    If Not Me.CHKSTARTDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE >= '" & Format(Me.TXTSTARTDATE, "dd/mm/yyyy") & "' "
    End If
    If Not Me.CHKENDDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE <= '" & Format(Me.TXTENDDATE, "dd/mm/yyyy") & "' "
    End If
    If Not Me.CHKREF Then
        SQL = SQL & "And R_RECHERCHE!REF = '" & Me.TXTREF & "' "
    End If
    If Not Me.CHKCUSTOMER Then
        SQL = SQL & "And R_RECHERCHE!CUSTOMER = '" & Me.CMBCUSTOMER & "' "
    End If
    If Not Me.CHKREP Then
        SQL = SQL & "And R_RECHERCHE!REP = '" & Me.CMBREP & "' "
    End If
    If Not Me.CHKGRADE Then
        SQL = SQL & "And R_RECHERCHE!GRADE = '" & Me.CMBGRADE & "' "
    End If
    If Not Me.CHKGROUP Then
        SQL = SQL & "And R_RECHERCHE!GROUP = '" & Me.CMBGROUP & "' "
    End If
    If Not Me.CHKMARKET Then
        SQL = SQL & "And R_RECHERCHE!MARKET = '" & Me.CMBMARKET & "' "
    End If
    If Not Me.CHKORDER Then
        SQL = SQL & "And R_RECHERCHE!ORDER = '" & Me.CMBORDER & "' "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    Me.LBLSTATS.Caption = DCount("*", "R_RECHERCHE", SQLWhere) & " / " & DCount("*", "R_RECHERCHE")
    Me.LSTRESULTS.RowSource = SQL
    Me.LSTRESULTS.Requery
     
    End Sub
     
    Private Sub LSTRESULTS_DblClick(Cancel As Integer)
     
    DoCmd.OpenForm "F_MODIFICATION", acNormal, , "[ID] = " & Me.LSTRESULTS
     
    End Sub
     
    Private Sub TXTSTARTDATE_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
    Private Sub TXTENDDATE_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
    Private Sub TXTREF_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
    Private Sub CMBCUSTOMER_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub CMBREP_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub CMBGRADE_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub CMBGROUP_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
     
    Private Sub CMBMARKET_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub
    Private Sub CMBORDER_BeforeUpdate(Cancel As Integer)
     
    RefreshQuery
     
    End Sub

    FRANK

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    toujours le meme problème ...

    ce n'est pas dd/mm/yyyy

    c'est mm/dd/yyyy ... le format US qui prévaut dans l'implémentation SQL d'Access

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci de m'aider dans la resolution de mon probleme... mais malheureusement ca n'a rien change. Ca fait toujours la meme chose, a savoir quand je clique sur la checkbox "date depart" le champ txt apparait; je saisie une date puis lorsque je valide, une message box apparait et me dit Erreur 3464 "Data type mismatch in criteria expression" et le debugger me surligne toujours la meme ligne en jaune en mode VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.LBLSTATS.Caption = DCount("*", "R_RECHERCHE", SQLWhere) & " / " & DCount("*", "R_RECHERCHE")
    Si je clique sur "date de fin" le meme message apparait et me renvoi a la meme ligne VBA par contre la je peux meme pas saisir une date dans le champ contrairement a "date depart"

    merci de votre aide

  4. #4
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    autre info capitale que vous avez manqué ... et qui est dans la FAQ, les dates sont en format US entourées de dièses (#).

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par cafeine
    autre info capitale que vous avez manqué ... et qui est dans la FAQ, les dates sont en format US entourées de dièses (#).
    Ca y'est ca marche.... merci cafeine!
    j'avais bien oublié les dieses!

    Par contre c'est pas encore parfait
    Pour que cela fonctionne correctement j'ai egalement du suprimer les RefreshQuery dans les 2 Sub suivants:

    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
     
    Private Sub CHKSTARTDATE_Click()
    If Me.CHKSTARTDATE Then
    Me.TXTSTARTDATE.Visible = False
    Else
    Me.TXTSTARTDATE.Visible = True
    End If
    RefreshQuery
    End Sub
     
    Private Sub CHKENDDATE_Click()
     
    If Me.CHKENDDATE Then
        Me.TXTENDDATE.Visible = False
    Else
        Me.TXTENDDATE.Visible = True
    End If
    RefreshQuery
    End Sub
    La conséquence est que lorsque je reclique sur la checkbox pour annuler le critere de filtrage date, celui ci reste valide et la liste des enregistrements LSTRESULTS ne s'actualise pas.

    Si je laisse les RefreshQuery (quand je clique sur la checkbox pour saisir une date) j'obtiens une erreur d'execution 3075: erreur de syntaxe dans la date dans l'expression ''R_RECHERCHE!ID <> 0 And R_RECHERCHE!QUOTEDATE >=##'. qui provient (surement) du fait que le champ date est vide

    Quelqu'un a une solution ?

    Pour info:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT ID, REF, CUSTOMER, GROUP, MARKET, REP, QUOTEDATE, GRADE, SHAPE, SIZE, WEIGHT, ORDER FROM R_RECHERCHE Where R_RECHERCHE!ID <> 0"
     
    If Not Me.CHKSTARTDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE >= #" & Format(Me.TXTSTARTDATE, "mm/dd/yyyy") & "# "
    End If
    If Not Me.CHKENDDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE <= #" & Format(Me.TXTENDDATE, "mm/dd/yyyy") & "# "
    Merci

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut

  7. #7
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    c'est le passage obligé lorsque la requête a été triturée ... analyser le SQL généré

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai tout remis a plat et ca n'a rien changé...

    Si je laisse les refreshQuery dans les sub suivantes

    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
     
    Private Sub CHKSTARTDATE_Click() 
    If Me.CHKSTARTDATE Then 
    Me.TXTSTARTDATE.Visible = False 
    Else 
    Me.TXTSTARTDATE.Visible = True 
    End If 
    RefreshQuery 
    End Sub 
     
    Private Sub CHKENDDATE_Click() 
     
    If Me.CHKENDDATE Then 
        Me.TXTENDDATE.Visible = False 
    Else 
        Me.TXTENDDATE.Visible = True 
    End If 
    RefreshQuery 
    End Sub
    quand je coche la checkbox "date depart", mon champ texte "date depart" devient visible mais me renvoie directement au message erreur d'execution 3075: erreur de syntaxe dans la date dans l'expression ''R_RECHERCHE!ID <> 0 And R_RECHERCHE!QUOTEDATE >=##'. car Access essaie de filtrer la table avant meme d'avoir saisie une date dans le champ et bien sur il lui est impossible d'afficher des donnees ulterieures a rien (aucune date).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Private Sub RefreshQuery() 
    Dim SQL As String 
    Dim SQLWhere As String 
     
    SQL = "SELECT ID, REF, CUSTOMER, GROUP, MARKET, REP, QUOTEDATE, GRADE, SHAPE, SIZE, WEIGHT, ORDER FROM R_RECHERCHE Where R_RECHERCHE!ID <> 0" 
     
    If Not Me.CHKSTARTDATE Then 
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE >= #" & Format(Me.TXTSTARTDATE, "mm/dd/yyyy") & "# " 
    End If 
    If Not Me.CHKENDDATE Then 
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE <= #" & Format(Me.TXTENDDATE, "mm/dd/yyyy") & "# "
    Si j'ignore le message de deboguage et je saisie une date puis valide cela marche parfaitement...
    mais si j'efface à nouveau la date et valide il me ressort son erreur 3075 ! car filtrage impossible.

    Comment puis je empecher le filtrage quand le champ est vide ?

    Cafeine

  9. #9
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    En fait j'ai eu recours a une autre solution... en supprimant tout simplement le message d'erreur :

    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
     
    Private Sub RefreshQuery()
     
    On Error GoTo Err_RefreshQuery
     
    Dim SQL As String
    Dim SQLWhere As String
     
    SQL = "SELECT ID, REF, QUOTEDATE, CUSTOMER, GROUP, MARKET, REP, GRADE, SHAPE, SIZE, WEIGHT, GBPPRICE, EURPRICE, ORDER FROM R_RECHERCHE Where R_RECHERCHE!ID <> 0"
     
    If Me.CHKSTARTDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE >= #" & Format(Me.TXTSTARTDATE, "mm/dd/yyyy") & "# "
    End If
    If Me.CHKENDDATE Then
        SQL = SQL & "And R_RECHERCHE!QUOTEDATE <= #" & Format(Me.TXTENDDATE, "mm/dd/yyyy") & "# "
    End If
    If Me.CHKREF Then
        SQL = SQL & "And R_RECHERCHE!REF = '" & Me.TXTREF & "' "
    End If
    If Me.CHKCUSTOMER Then
        SQL = SQL & "And R_RECHERCHE!CUSTOMER = '" & Me.CMBCUSTOMER & "' "
    End If
    If Me.CHKREP Then
        SQL = SQL & "And R_RECHERCHE!REP = '" & Me.CMBREP & "' "
    End If
    If Me.CHKGRADE Then
        SQL = SQL & "And R_RECHERCHE!GRADE = '" & Me.CMBGRADE & "' "
    End If
    If Me.CHKGROUP Then
        SQL = SQL & "And R_RECHERCHE!GROUP = '" & Me.CMBGROUP & "' "
    End If
    If Me.CHKMARKET Then
        SQL = SQL & "And R_RECHERCHE!MARKET = '" & Me.CMBMARKET & "' "
    End If
    If Me.CHKORDER Then
        SQL = SQL & "And R_RECHERCHE!ORDER = '" & Me.CMBORDER & "' "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    Me.lblStats.Caption = DCount("*", "R_RECHERCHE", SQLWhere) & " / " & DCount("*", "R_RECHERCHE")
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    Exit_RefreshQuery:
        Exit Sub
     
    Err_RefreshQuery:
        Resume Exit_RefreshQuery
     
    End Sub
    En tout cas merci beaucoup Cafeine de m'avoir aidé

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

Discussions similaires

  1. [AC-2007] Formulaire de recherche multicritere
    Par sifawahmed dans le forum IHM
    Réponses: 6
    Dernier message: 24/03/2015, 01h22
  2. Réponses: 7
    Dernier message: 13/06/2008, 12h33
  3. Réponses: 8
    Dernier message: 20/09/2006, 16h09
  4. quest sur recherche multicritere de cafeine
    Par yoyoo dans le forum Access
    Réponses: 1
    Dernier message: 10/07/2006, 16h58
  5. Réponses: 6
    Dernier message: 05/01/2006, 15h09

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