Filtro record su maschere continue

di il
6 risposte

Filtro record su maschere continue

Buonasera, avrei bisogno di chiedere un consiglio riguardo al filtraggio di record.

In tabella tblNominativi ho vari campi: Cognome (testo breve), Nome (testo breve), Data Nascita (Data/Ora),......Archiviato(Si/No).

Questi dati vengono rappresentati in una maschera frmNominativi con visualizzazione a Maschere continue.

In questa maschera (oltre ai vari oggetti) ho una textbox denominata search_box la quale mi serve per poter digitare il Cognome o Nome da ricercare, presente in tabella.

Generalmente utilizzo il seguente codice:
Private Sub search_box_AfterUpdate()
'CASELLA DI TESTO CERCA
Dim s As String, r As String
    
        Echo False
        
        FilterOn = False
        s = "[Cognome] Like %1 Or [Nome] Like %1"    ---------------->Valorizzo stringa s col Cognome o Nome estratti dai relativi campi
        r = Replace(s, "%1", Chr(34) & search_box & "*" & Chr(34))   ------> Valorizzo stringa r con una sostituzione della stinga s in base a ciò che ho digitato nella textbox 
        Filter = r  -----> Filtra la maschera in base al valore di r
        FilterOn = True  ------>Applica il filtro e mostra dunque tutto ciò che è presente in tabella che inizia con quello che ho scritto in textbox
        
        Echo True
        
        search_box = ""
        search_box.SetFocus
   
        If Me.Recordset.RecordCount = 0 Then
        
            MsgBox "Non esistono dati simili in elenco!!", vbCritical, "CONTROLLO CONTATTI"
            FilterOn = False
            
        End If
        
End Sub
La sub funziona e fa bene il suo lavoro. Adesso però ho un problema in quanto per ragioni di necessità ho bisogno di filtrare i record oltre che al Cognome o Nome ma anche in base al valore del campo Archiviato.

Cioè se ad esempio in tabella ho:
Id-------Cognome-------Nome-------Archiviato
1-------Tizio-------------Sempronio------No
2-------Giovanni--------Francesco-------Si
3-------Claudio---------Valerio------------Si
4-------Giorgio---------Vittorio------------Si
5-------Clarissa---------Ambra------------No
6-------Giosuè----------Daniele-----------No


e in textbox search_box digito Gio, allora il filtro dovrà filtrare solo: Giovanni e Giorgio perché il campo Archiviato è valorizzato a True. Dovrà dunque estromettere Giosuè, proprio perché il suo record ha il campo Archiviato su False

Non so se si può lavorare su questa sub ampliandola oppure serve di qualcosa di diverso.

Grazie a tutti.

6 Risposte

  • Re: Filtro record su maschere continue

    Premesso che [r] e [s] sono inutili come è inutile il Replace... puoi costruire direttamente il criterio senza tanti replace non necessari.

    Detto questo... se non ho capito male...
    
    (COGNOME LIKE Criterio OR Nome like Ceiterio) AND Archiviato=True
    
    Attenzione alle parentesi...
  • Re: Filtro record su maschere continue

    Scusa ma forse non ho capito o sbaglio qualcosa. Ho provato così:
    FilterOn = False
    Filter = ([Cognome] Like search_box & "*" Or [Nome] Like search_box & "*") And Archiviato = True
    FilterOn = True
    
    ma non ho alcun riscontro. Non fa praticamente nulla. Forse è la stanchezza agli occhi che mi fa sfuggire qualcosa
  • Re: Filtro record su maschere continue

    Gli Apicetti dove sono...?(sintassi da usare per i testi...)
    Prima avevi il chr(34)... se lo togli metti gli APICETTI... e poi la stringa di testo non va bene...

    Prima di mandarla alla proprietà filter fai un debug.print della stringa e leggila
  • Re: Filtro record su maschere continue

    Ma in realtà avevo già fatto il test con gli apici o con chr(34) ma il risultato non cambia. Non funziona:
    FilterOn = False   
    Filter = ([Cognome] Like Chr(34) & search_box & "*" & Chr(34) Or [Nome] Like Chr(34) & search_box & "*" & Chr(34)) And Archiviato = True
    FilterOn = True
    Però ho fatto una prova con:
    FilterOn = False
    s = "([Cognome] Like %1 Or [Nome] Like %1) And Archiviato = True"
    r = Replace(s, "%1", Chr(34) & search_box & "*" & Chr(34))
    Filter = r
    FilterOn = True
    Echo True
    
    e funziona. Come mai?

    Ho anche provato a mettere le virgolette ("") all'inizio e alla fine di Filter:
    Filter = "([Cognome] Like Chr(34) & search_box & "*" & Chr(34) Or [Nome] Like Chr(34) & search_box & "*" & Chr(34)) And Archiviato = True"
    ma non funziona comunque.

    Diciamo che per il momento va bene così. Però ero curioso di provare il tuo codice snellito da variabili e replace.
  • Re: Filtro record su maschere continue

    Mi pare tu non abbia molto chiaro come si costruisce la stringa...
    
    Filter = "([Cognome] Like" & Chr(34) & search_box & "*" & Chr(34) & " Or [Nome] Like " & Chr(34) & search_box & "*" & Chr(34) & ") And Archiviato = True"
    
  • Re: Filtro record su maschere continue

    Ahhh.....ok ok, hai ragione. Gli apici mancavano. Bene grazie come sempre. Ora tutto funziona.
Devi accedere o registrarti per scrivere nel forum
6 risposte