03/04/2024 - A.TIRANNA ha scritto:
- Quanto apro la maschera la situazione è quella che si vede dalla immagine e la combo funziona così come la query sottostante.
- Se seleziono nei filtri della colonna “cliente” (ma potrebbe essere un'altra qualsiasi colonna) una ragione sociale e poi torno alla situazione iniziale
Ciao,
vediamo un attimo di fare ordine nelle cose….
poniamo di avere :
- una Form dove è presente un pulsante (lo chiameremo ComboBoxFilter)
- una SubForm in visualizzazione dati
- in origine dati si ha una query
- che sia una query esistente oppure una query creata in designer, non fa differenza
- se la query ha una Where Condition impostata oppure no, non fa differenza
Con ciò si vuole filtrare i records del foglio dati sia con la combobox che con i filtri sulle colonne del foglio dati.
Per ottenere questo scenario sarà sufficiente impostare le proprietà Filter nell'azioni della combobox : (in questo caso sull'evento Click)
Private Sub ComboBoxFilter_Click()
Me.TuaSForm.Form.filter = "TuaField Like '*" & Me.ComboBoxFilter.Text & "*'"
Me.TuaSForm.Form.FilterOn = True
End Sub
(In questo esempio si imposta un filtro sul valore di una colonna di tipo string)
Adesso vediamo operativamente cosa può accadere:
- Se imposto il filtro da combobox, viene applicato il filtro al foglio dati
- Se nel foglio dati,su una o più colonne, imposto altri filtri, verranno filtrati i records voluti
- Se si ritorna ad impostare una nuova ricerca nella combobox, allora viene impostato il filtro come da esempio sopra e andrà a ricoprire (e quindi annulla) i filtri applicati nelle colonne del foglio dati
- Se nella combobox non si sceglie nulla e si imposta “vuoto”, allora il filtro viene applicato ricoprendo eventuali filtri impostati nelle colonne del foglio dati e si vedranno tutti i records che produce la query impostata in origine dati della subform.
Quindi non è necessario fare nessuna requery nell'impostare i vari filtri
Se invece abbiamo la necessità di modificare la where condition della query impostata in origine dati, allora sarà sufficiente eliminare i filtri impostati in precedenza e poi avviare la modifica alla where e quindi eseguire la requery per ricaricare il foglio dati con i nuovi records
Per esempio:
Private Sub ComboBoxFilter_Click()
' reset filter
Me.TuaSForm.Form.Filter = ""
Me.TuaSForm.Form.FilterOn = False
' modifica query impostando la nuova where condition sulla base del valore ottenuto dalla selezione nella combobox
' eseguire la requery
End Sub
Se per esempio la combobox restituisce un ID o una Variabile numerica, allora possiamo scrivere una cosa di questo tipo per filtrare tutti i records per una certa condizione (per esempio potrebbe essere l'Id anno oppure l'anno) :
Private Sub ComboBoxFilter_Click()
' reset filter
Me.TuaSForm.Form.Filter = ""
Me.TuaSForm.Form.FilterOn = False
' set recordsource sql select
Dim stringSql As String
stringSql = "SELECT ID, intField01, Field02, Field03, Field04, ....... FROM TuaTabella"
' set recordsource sql where condition
Dim stringWhere As String
stringWhere = "WHERE intField01 = " & Me.ComboBoxFilter.Text & ";"
' set new recordsource
Me.SFormVerificaFiltri.Form.RecordSource = stringSql & " " & stringWhere
' requery
Me.SFormVerificaFiltri.Form.Requery
End Sub
In questo caso :
- si resetta il filter
- si prepara la nuova stringa sql per realizzare la nuova query
- si imposta, secondo il valore restituito dalla selezione della combobox, la nuova where condition
- si imposta il nuovo recordsource
- si esegue la requery per caricare i nuovi records filtrati per la nuova condizione
Operativamente si traduce in :
- quando si impostano i filtri sulle colonne del foglio dati si fitra il recordsource e si ottengono i records desiderati
- se si ritorna alla combobox per selezionare un nuovo item:
- viene resettato il filtro impostato nelle colonne del foglio dati
- viene ricostruita la nuova query con la nuova where condition
- si imposta la nuova query al recordsource del foglio dati
- si esegue la requery per ricaricare il foglio dati con le nuove informazioni
- si ripete dal punto 1. ecc.ecc.
Tutto qua… la logica per alcuni scenari possibili è quanto appena descritto. Verifica se hai altre condizioni particolari, … o come where condition, o come filter, ecc.ecc… e fai sapere.
Ciaooo… ;-)