Ricerca non filtra bene

di il
4 risposte

Ricerca non filtra bene

Sto eseguento tramite campo di testo una ricerca.

Public Function ricerca_key(key, filtro_sql)
On Error GoTo errHandler
With CodeContextObject
.Form.AllowEdits = True
If Len(.Form.Controls("ricerca").Text) > 0 Then
Select Case key
Case Is = 32  ' codice per inserire spazio
.Form.Controls("ricerca").Value = .Form.Controls("ricerca").Value & " "
End Select
  .Form.Filter = filtro_sql
  .Form.FilterOn = True
  .Form.Controls("ricerca").SelStart = Len(.Form.Controls("ricerca").Value)
Else
.Form.Requery
End If
End With
Exit Function
errHandler:
If Err.Number = "2185" Then
Exit Function
End If
MsgBox Err.Number & " - " & Err.Description, vbOKOnly, "Error ..."
End Function

Ri'chiamo la funzione 

Private Sub ricerca_KeyUp(KeyCode As Integer, Shift As Integer)
dim anno as string

anno="2023"
ricerca_key KeyCode, "[ANNO] = '" & anno & "' AND [utente] LIKE '*" & Me.ricerca.Text & "*' OR [nome] LIKE '*" & Me.ricerca.Text & "*' OR [cognome] LIKE '*" & Me.ricerca.Text & "*' OR [iscritto] LIKE '*" & Me.ricerca.Text & "*'"
End Sub

Tramite un pulsante metto il filtro per visualizzare solo i record del 2023.

la ricerca funziona solo che mentre digito mi fa vedere tutti i record ignorando il filtro

4 Risposte

  • Re: Ricerca non filtra bene

    Innanzitutto stai definendo la variabile anno come tipo stringa e non numerico come dovrebbe essere. Per me il tuo codice è da riscrivete. Ad ogni modo l'argomento è stato trattato talmente tante volte che basta fare una ricerca sul sito per trovare un metodo abbastanza efficiente per applicare un filtro.

  • Re: Ricerca non filtra bene

    Attenzione alle AND e alle OR … usa le parentesi per indicare le precedenze secondo quello che vuoi ottenere.

    P.S. La Select Case per un solo valore non ha molto senso

  • Re: Ricerca non filtra bene

    08/06/2023 - lucavalentino ha scritto:


    Tramite un pulsante metto il filtro per visualizzare solo i record del 2023.

    la ricerca funziona solo che mentre digito mi fa vedere tutti i record ignorando il filtro

    Ciao,

    è ovvio che ad ogni carattere ti esegue la ricerca…  hai usato l'evento KeyUp

    O metti un pulsante e usi l'evento Click del pulsante

    Oppure senza pulsante e usi l'evento AfterUpdate della textbox

    In più come ti hanno già detto, il codice è da riscrivere. Non va bene.
    E le condizioni Where dall' AND al LIKE agli OR …. sai come si comporta esattamente ? rifletti e vedi di inserire le parentesi in modo che le condizioni si verificano a dovere.

    Domanda… ma perchè l'anno l'hai messo tipo stringa ?  che ragionamento hai fatto ?

  • Re: Ricerca non filtra bene

    08/06/2023 - lucavalentino ha scritto:


    la ricerca funziona solo che mentre digito mi fa vedere tutti i record ignorando il filtro

    La ricerca funziona in qualche modo … in quanto per come hai impostato le condizioni Where non c'è molta logica.

    Se il ragionamento è : 

    • Filtra tutti i records per 
      • anno 2023 
      • filtra tutti i records dove i caratteri di ricerca sono contenuti in parte :
        • su utente
        • oppure su nome
        • oppure su cognome 
        • oppure su iscritto

    se la ricerca che vuoi eseguire è quanto riportato sopra, allora la Where Condition devi almeno scriverla in questo modo:

    Per esempio utilizzando l'evento AfterUpdate

    Private Sub ricerca_AfterUpdate()
    Me.Form.Filter = "ANNO='" & CStr(2023) & "' AND (utente LIKE '*" & Me.ricerca.Text & "*' OR nome LIKE '*" & Me.ricerca.Text & "*' OR cognome LIKE '*" & Me.ricerca.Text & "*' OR iscritto LIKE '*" & Me.ricerca.Text & "*')"
    Me.Form.FilterOn = True
    End Sub

    E se per esempio  la ricerca non ha esito, puoi usare l'evento Exit per rimanere nel TextBox di ricerca fino a quando non vengono trovati records corrispondenti:

    Private Sub ricerca_Exit(Cancel As Integer)
    If Me.Form.Recordset.RecordCount = 0 Then Cancel = True
    End Sub

    Insomma… con 3 righe di codice e utilizzando gli eventi appropriati fai tutto. 
    La function di ricerca che hai utilizzato ha un altro scopo e mi sembra che non corrisponda affatto alle tue necessità. Ma non conoscendo bene il contesto in cui ti trovi, potrei anche sbagliare.

    Invece da chiarire se il campo ANNO della tabella/query da filtrare, è un campo tipo stringa oppure numerico. Anche qui ci sarebbe da disquisire, ma comunque:

    Se è di tipo stringa sarà sufficiente :
    Me.Form.Filter = "ANNO='" & CStr(2023) & "' AND . . . . .
    
    Se invece è numerico : 
    Me.Form.Filter = "ANNO=" & 2023 & " AND . . . . .

    Però non hai specificato bene il contesto … se ti trovi in una form a maschere continue, oppure se hai una form principale e una subform dove vengono visualizzati tutti i records da filtrare… Insomma le cose possono più o meno cambiare e, se cambia il contesto può essere necesario inserire controlli di varia natura sia prima che dopo aver effettuato la ricerca.


    Per quanto sopra riportato, è evidente che tu debba approfondire meglio alcuni argomenti quali:
    Eventi Form : Ordine degli eventi per gli oggetti di database - Supporto tecnico Microsoft
    Tipo Dati : Riepilogo dei tipi di dati - Visual Basic | Microsoft Learn
    Where Condition : WHERE clause (Microsoft Access SQL) | Microsoft Learn
    Etc…

Devi accedere o registrarti per scrivere nel forum
4 risposte