Come "accorpare" in vari filtri in una maschera

di il
13 risposte

Come "accorpare" in vari filtri in una maschera

Salve,

Sono “abbastanza neofita”. Nel mio DB (Access 2019) ho creato una maschera con alcuni filtri da caselle combinate che funzionano perfettamente con il semplice codice: 

per es:

Private Sub CercaCitta_AfterUpdate()
Me.Filter = "[Citta] = '" & Me.CercaCitta & "'"
Me.FilterOn = True

Private Sub CercaNome_AfterUpdate()
Me.Filter = "[Nome] = '" & Me.CercaNome & "'"
Me.FilterOn = True

e cosi via per altri campi.

Non sono riuscito, nonostante le mie ricerche, a trovare un modo, possibilmente semplice, di “accorpare” i vari filtri in modo, per esempio da vedere …. quanti tra i miei record hanno un determinato cognome e vivono in quella particolare città…

Qualcuno può darmi una dritta ?

Grazie

13 Risposte

  • Re: Come "accorpare" in vari filtri in una maschera

    Ciao,

    potresti fare diverse cose … per esempio:

    Private Sub CercaCitta_AfterUpdate()
        ' check if active filter
        If Me.FilterOn Then
            ' update filter
            Me.Filter = Me.Filter & " AND [Citta] = '" & Me.CercaCitta & "'"
        Else
            ' set filter
            Me.Filter = "[Citta] = '" & Me.CercaCitta & "'"
        End If
        ' apply filter
        Me.FilterOn = True
    End Sub
    
    Private Sub CercaNome_AfterUpdate()
        ' check if active filter
        If Me.FilterOn Then
            ' update filter
            Me.Filter = Me.Filter & " AND [Nome] = '" & Me.CercaNome & "'"
        Else
            ' set filter
            Me.Filter = "[Nome] = '" & Me.CercaNome & "'"
        End If
        ' apply filter
        Me.FilterOn = True
    End Sub

    Ovviamente devi implementare le funzioni nel caso in cui entrambe i filtri vengono resettati.
    Quindi imposterai Filter = “” e FilterOn = False

    Prova a provare … potrebbe essere un approccio da seguire ;-) 

  • Re: Come "accorpare" in vari filtri in una maschera

    Grazie By65Franco

    Da quando ho capito dovrei sostituire le mie due sub con quelle che mi hai descritto, giusto ?

  • Re: Come "accorpare" in vari filtri in una maschera

    11/04/2024 - aurecop51 ha scritto:


    Grazie By65Franco

    Da quando ho capito dovrei sostituire le mie due sub con quelle che mi hai descritto, giusto ?

    Direi di si … altrimenti rimani con quelle come le hai impostate te … ahahahahahahahah

    mi hai fatto piegare in due dal ridere…. 

    Tornado seri, direi che puoi sostituire il codice all'internno delle tue Sub con quello che ti ho proposto…. tieni conto che è solo un esempio.

    Se ritieni, vanno implementate con controlli come per esempio che se il FilterOn = True allora anche Filter deve contenere qualcosa (che non sia vuoto il Filter)

    Insomma.. la mia è una traccia che se soddisfa le tue esigenze, dovrai poi implementare ciò che occorre per migliore i controlli e l'efficacia.

  • Re: Come "accorpare" in vari filtri in una maschera

    Sono felice di averti fatto fare una risata !  Perlomeno anche io sono servito a qualcosa…

    Li proverò e ti farò sapere.

    Grazie ancora per la cortesia e la disponibilità

  • Re: Come "accorpare" in vari filtri in una maschera

    11/04/2024 - aurecop51 ha scritto:


    Sono felice di averti fatto fare una risata !  Perlomeno anche io sono servito a qualcosa…

    Li proverò e ti farò sapere.

    Grazie ancora per la cortesia e la disponibilità

    Il minimo , ci mancherebbe… poi sei  uno dei pochi che imposta un Filter come si deve ;-)

  • Re: Come "accorpare" in vari filtri in una maschera

    Ciao

    ti dico come faccio io e mi sono sempre trovato bene

    all'inizio del modulo della maschera dichiaro una variabile (quindi conosciuta a tutto e solo quel modulo)

    Option Explicit
    Dim strfiltro As String

    poi nello stesso modulo creo una sub (le diverse scelte sono tutte in AND

    Private Sub filtradati()
    strfiltro = ""
    if questo then
            strfiltro = strfiltro & IIf(Len(strfiltro) > 0, " AND ", "") & "[idcliente] = " & me.idcliente
    endif
    if quello then
            strfiltro = strfiltro & IIf(Len(strfiltro) > 0, " AND ", "") & "[importo] = " & me.importo
    endif
    ….
    ' alla fine
        If Len(strfiltro) > 0 Then
           Me.Filter = strfiltro
           Me.FilterOn = True
       Else
           Me.Filter = ""
           Me.FilterOn = False
       End If
    End Sub

    e ad ogni evento di ogni scelta

    Private Sub SceltaMese_Click()
       Call filtradati
    End Sub
    

    nella stringa di filtro devi fare attenzione al tipo di dati: se testo lo devi racchiudere tra apici, se data  lo devi convertire in formato sql

    per le date mi sono fatto questa funzione

    Public Function RendiDataPerSQL(mdata As Date) As String
       RendiDataPerSQL = Format(mdata, "\#mm/dd/yyyy\#")
    End Function

    ciao

  • Re: Come "accorpare" in vari filtri in una maschera

    11/04/2024 - By65Franco ha scritto:


    Ciao,

    potresti fare diverse cose … per esempio:

    Private Sub CercaCitta_AfterUpdate()
        ' check if active filter
        If Me.FilterOn Then
            ' update filter
            Me.Filter = Me.Filter & " AND [Citta] = '" & Me.CercaCitta & "'"
        Else
            ' set filter
            Me.Filter = "[Citta] = '" & Me.CercaCitta & "'"
        End If
        ' apply filter
        Me.FilterOn = True
    End Sub
    
    Private Sub CercaNome_AfterUpdate()
        ' check if active filter
        If Me.FilterOn Then
            ' update filter
            Me.Filter = Me.Filter & " AND [Nome] = '" & Me.CercaNome & "'"
        Else
            ' set filter
            Me.Filter = "[Nome] = '" & Me.CercaNome & "'"
        End If
        ' apply filter
        Me.FilterOn = True
    End Sub

    Ovviamente devi implementare le funzioni nel caso in cui entrambe i filtri vengono resettati.
    Quindi imposterai Filter = “” e FilterOn = False

    Prova a provare … potrebbe essere un approccio da seguire ;-) 

    Ciao sto provando questo tuo metodo che mi funziona…. abbastanza.  

    Ho problema nell'eliminare tutti i filtri nel senso che sto usando un comando con:

    Private Sub EliminaFiltro_Click()
    CercaNome = ""
    CercaCitta = ""
    Me.Filter = ""
    Me.FilterOn = False

    ma mi sta creando problemi. Forse non ho ben capito come usare il tuo consiglio in fondo:

        "Ovviamente devi implementare le funzioni nel caso in cui entrambe i filtri vengono resettati.
         Quindi imposterai Filter = “” e FilterOn = False"

    e poi una volta usato per filtro un determinato nome questo mi compare sempre e comunque alla riapertura della maschera a meno che io non clicchi più di una volta sul comando “Elimina Filtro”, di cui sopra

  • Re: Come "accorpare" in vari filtri in una maschera

    12/04/2024 - bruma ha scritto:


    Ciao

    ti dico come faccio io e mi sono sempre trovato bene

    all'inizio del modulo della maschera dichiaro una variabile (quindi conosciuta a tutto e solo quel modulo)

    Option Explicit
    Dim strfiltro As String

    poi nello stesso modulo creo una sub (le diverse scelte sono tutte in AND

    Private Sub filtradati()
    strfiltro = ""
    if questo then
            strfiltro = strfiltro & IIf(Len(strfiltro) > 0, " AND ", "") & "[idcliente] = " & me.idcliente
    endif
    if quello then
            strfiltro = strfiltro & IIf(Len(strfiltro) > 0, " AND ", "") & "[importo] = " & me.importo
    endif
    ….
    ' alla fine
        If Len(strfiltro) > 0 Then
           Me.Filter = strfiltro
           Me.FilterOn = True
       Else
           Me.Filter = ""
           Me.FilterOn = False
       End If
    End Sub

    e ad ogni evento di ogni scelta

    Private Sub SceltaMese_Click()
       Call filtradati
    End Sub
    

    nella stringa di filtro devi fare attenzione al tipo di dati: se testo lo devi racchiudere tra apici, se data  lo devi convertire in formato sql

    per le date mi sono fatto questa funzione

    Public Function RendiDataPerSQL(mdata As Date) As String
       RendiDataPerSQL = Format(mdata, "\#mm/dd/yyyy\#")
    End Function

    ciao

    Grazie. Essendo un neofita ho bisogno di alcune delucidazioni:

    1- Devo creare un modulo nella maschera (e non nelle varie cbo) in cui inserire variabile e sub ?

    2- mi spieghi meglio dove e come inserire : 

    e ad ogni evento di ogni scelta

    Private Sub SceltaMese_Click()
       Call filtradati
    End Sub

    3- come dovrei agire per trasformare una data in formato sql ?

    Scusa la mia ignoranza

  • Re: Come "accorpare" in vari filtri in una maschera

    12/04/2024 - aurecop51 ha scritto:


    Ho problema nell'eliminare tutti i filtri nel senso che sto usando un comando con:

    Private Sub EliminaFiltro_Click()
    CercaNome = ""
    CercaCitta = ""
    Me.Filter = ""
    Me.FilterOn = False

    ma mi sta creando problemi.

    Ciao, 
    prima di tutto nel Pulsante EliminaFiltro_Click() elimina ciò che hai scritto e scrivi il tutto in una sub separata
    Questa Sub la richiami alla pressione del pulsante EliminaFiltro e in FormLoad

    Esempio:

    ' FORM LOAD
    Private Sub Form_Load()
    	' reset Filter
    	ResettaFiltro
    End Sub
    
    
    ' BUTTON RESET FILTER
    Private Sub EliminaFiltro_Click()
    	' reset filter
    	MyResetFilter
    End Sub
    
    
    ' RESET FILTER
    Private Sub MyResetFilter()
    	' reset filter
    	Me.Filter = ""
    	Me.FilterOn = False
    	' reset combobox
    	Me.CercaCitta = ""
    	Me.CercaNome = ""
    End Sub

    Ma a tutto c'è un perchè, una spiegazione.
    Se vai in in designer nella struttura della form vedrai in Filter qualcosa di impostato… Questo qualcosa è proprio ciò che ti filtra quando riapri la Form.

    Questo accade in quanto viene memorizzato nella form l'ultimo filtro impostato… ho elimini queste impostazioni in fase di Close della Form oppure lo resetti tutte le volte che apri la Form.

    Pertanto per evitare che venga applicato un filtro non voluto, allora in FormLoad la prima cosa che farai sarà quella di resettare le impostazioni del Filtro. In questo modo sei sicuro che il comportamento del filtro rispecchi ciò che desideri.

    Ma del resto quando si unsano dei controlli e delle proprietà, è buona norma inizializzare sempre i valori all'apertura della form, in modo da rispettare rigorosamente la logica che voi impostare per la form.

    Vedrai che in questo modo non avrai mai problemi.  ;-) 


    Per esempio il codice completa risulterà essere una cosa di questo tipo:

    ' FORM LOAD
    Private Sub Form_Load()
    	' reset Filter
    	ResettaFiltro
    End Sub
    
    ' COMBOBOX CITTA' - SET FILTER
    Private Sub CercaCitta_AfterUpdate()
        ' check if active filter
        If Me.FilterOn Then
            ' update filter
            Me.Filter = Me.Filter & " AND [Citta] = '" & Me.CercaCitta & "'"
        Else
            ' set filter
            Me.Filter = "[Citta] = '" & Me.CercaCitta & "'"
        End If
        ' apply filter
        Me.FilterOn = True
    End Sub
    
    ' COMBOBOX NOME - SET FILTER
    Private Sub CercaNome_AfterUpdate()
        ' check if active filter
        If Me.FilterOn Then
            ' update filter
            Me.Filter = Me.Filter & " AND [Nome] = '" & Me.CercaNome & "'"
        Else
            ' set filter
            Me.Filter = "[Nome] = '" & Me.CercaNome & "'"
        End If
        ' apply filter
        Me.FilterOn = True
    End Sub
    
    ' BUTTON RESET FILTER
    Private Sub EliminaFiltro_Click()
    	' reset filter
    	MyResetFilter
    End Sub
    
    ' RESET FILTER
    Private Sub MyResetFilter()
    	' reset filter
    	Me.Filter = ""
    	Me.FilterOn = False
    	' reset combobox
    	Me.CercaCitta = ""
    	Me.CercaNome = ""
    End Sub

    Tutto qua, molto semplice ;-)

  • Re: Come "accorpare" in vari filtri in una maschera

    12/04/2024 - bruma ha scritto:


    ti dico come faccio io e mi sono sempre trovato bene

    Ciao,

    beh, le tecniche sono le più diverse e variopinte.

    Quando un codice è scritto bene e rispetta la logica che si vuol dare, in questo caso, ad un Form… non ci saranno mai problemi.
    Tutto dipende dai vari scenari e necessità particolari o meno. 

    In questo caso specifico per esempio ho cercato di tenere la stessa traccia di ciò che aveva già in parte realizzato l'autore del Thread.

    Poi sta a lui approfondire gli argomenti ed impostare il suo codice come ritiene più opportuno. 
    Alla fine noi conosciamo solo un pezzettino del suo progetto, due righe di codice e non il contesto e lo scenario completo.

    Quindi come capita sovente si danno solo risposte generiche e tecniche. Sta a lui poi comprendere la tecnica e un possibile approccio approfondento argomenti dove ha riscontrato dei problemi.

    11/04/2024 - aurecop51 ha scritto:


    Sono “abbastanza neofita

    Infatti apre il Thread affermando di essere neofita… deve ancora maturare esperienza e studiare molto. Penso che sia sulla giusta strada e per agevolarlo bisogna mettersi nei suoi panni cercando di essere più esaustivi possibile e porsi al suo stesso livello per meglio farsi capire.

    Tutto qua….
    un salutone ;-) 

  • Re: Come "accorpare" in vari filtri in una maschera

    Ciao By65Franco

    ti ringrazio ancora una volta per la disponibilità dimostrata non solo nei consigli ma anche nei principi che caratterizzano il tuo lavoro, come si deduce da quanto hai scritto sopra. Ritengo sia esattamente questo il modus operandi di coloro che mettono a disposizione  di tutti il proprio sapere.

    Sto eseguendo quanto mi hai consigliato. Sicuramete avrò ancora qualche problema che spero di risolvere autonomamente (anche per i tuoi stimoli). Se non dovessi riuscirci saprò a chi rivolgermi per ulteriori consigli.

    Buon lavoro.

  • Re: Come "accorpare" in vari filtri in una maschera

    13/04/2024 - aurecop51 ha scritto:


    Sicuramete avrò ancora qualche problema che spero di risolvere autonomamente

    Ciao, i problemi sono sempre fonte di ispirazione ;-))

    Ti lascio un esempio semplice semplice semplice dove puoi vedere e approfondire l’utilizzo di Filter in una Form e/o SubForm, ecc…
    Puoi valutare un filtro di ricerca sulla base di un Testo, su di una Data… con l’utilizzo degli operatori “=”  “Like” e la clausola “AND”. 
    Nella Parte inferiore della Form viene visualizzata la stringa di ricerca che si ottiene e che viene passata alla proprietà Filter.

    In questo esempio troverai:

    • Una Form che contiene i controlli ComboBox e TextBox per la ricerca
    • Un Bottone per la selezione del tipo di ricerca di esempio
    • Un Pulsante di Reset per inizializzare le Ricerche.
    • Una SubForm in modalità foglio dati dove applicare/visualizzare l’esito delle ricerche.

    I tipi di ricerca in questo caso sono due:

    • Una ricerca “esatta” sulla base delle selezioni effettuate attraverso le ComboBox (per esempio prova a ricerca il sig.re Mario)
    • Una ricerca “che contiene – string matching” sulla base del testo inserito nella TexBox

    Sono solo dati a titolo di esempio ;-) quindi non guardare la logica dell'informazioni ma solo gli esiti delle ricerche.


    Troverai delle funzioni molto semplificate che in ordine sono:

    • FORM LOAD
      • Inizializzazione della Form 
        • Reset Filter
        • Impostazione di default dell’opzioni (a titolo di esempio tipo ricerca)
    • OPTION SEARCH
      • Rappresenta un bottone per impostare il Filter con le ComboBox oppure con una TextBox
        • Reset Filter
        • Imposta i controlli ComboBox e TextBox sulla base del tipo di ricerca che vuoi eeffettuare
    • BUTTON RESET FILTER
      • Viene richiamata la funzione di RESET FILTER per inizializzare le ricerche
    • COMBOBOX CITY SEARCH
      • Viene richiamata la funzione FILTER SUBFORM APPLY per applicare il filtro di ricerca
    • COMBOBOX NAME SEARCH
      • Viene richiamata la funzione FILTER SUBFORM APPLY per applicare il filtro di ricerca
    • COMBOBOX DATE  SEARCH
      • Viene richiamata la funzione FILTER SUBFORM APPLY per applicare il filtro di ricerca
    • TEXTBOX SEARCH NAME - STRING MATCHING
      • Viene richiamata la funzione FILTER SUBFORM APPLY per applicare il filtro di ricerca
    • FILTER SUBFORM APPLY
      • Applica il filtro di ricerca
        • Viene inizializzata una stringa di ricerca “stringFilter”
        • Controlla “OptionSearch” per determinare se eseguire una ricerca esatta con le ComboBox oppure una ricerca “string matching” con la TextBox
        • Viene costruita la stringa di ricerca da passare al filtro della Form
        • Controlla se la stringa filtro contiene qualcosa “stringFilter <> vbNullString”
          • Applica il filtro di ricerca
          • Oppure disattiva il filtro di ricerca
    • RESET FILTER
      • Si occupa di ripristinare le condizioni iniziali di ricerca nella Form
        • Disattiva il filtro
        • Inizializza a vuoto le ComboBox e TextBox di ricerca

    Qui puoi scaricare questa piccola demo MsAccessSetFilter.zip

    Ripeto, è solo un piccolo esempio che utilizza un metodo molto semplice e lineare che può darti una idea di cosa potresti fare con i Filtri Form e di come puoi organizzare con una certa logica il tuo codice Vba per tenerlo pulito, essenziale e organizzato senza inutili ridondanze.
    Ovviamente esistono altre tecniche e approcci, i più diversi… ho solo cercato di darti un esempio per approfondire e studiare tale argomento che potrai implementare a tuo piacimento. Per esempio refreshare le ComboBox sulla base delle scelte effettuate nelle altre ComboBox (un sistema a cascata), utilizzare altri operatori diversi da “=” e da “Like” e con le clausole And e Or da abbinare in diversi modi per certi tipi di ricerca.


    Spero ti faccia comodo per costruirti i tuoi futuri filtri di ricerca 
    Ciao…

  • Re: Come "accorpare" in vari filtri in una maschera

    Ok, lo studierò. Grazie

Devi accedere o registrarti per scrivere nel forum
13 risposte