ciao a tutti,
devo filtrare dei record di una tabella ADO.
dopo aver cliccato su onfilterecord come posso impostare la procedura per visualizzare nella dbgrid solo i record con il campo "stato" di tipo TWidestring uguale a "Si" ??
ciao
ciao a tutti,
devo filtrare dei record di una tabella ADO.
dopo aver cliccato su onfilterecord come posso impostare la procedura per visualizzare nella dbgrid solo i record con il campo "stato" di tipo TWidestring uguale a "Si" ??
ciao
Puoi controllare lo stato del campo utilizzando il riferimento al DataSet che ti viene passato come parametro al metodo di gestione dell'evento. Nel tuo caso, puoi scrivere un codice simile al seguente:
Ciao!codice:procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept := DataSet.FieldByName('stato').AsString = 'Si'; end;![]()
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
ciao alka,
provo come mi hai detto
ciao e grazie
ciao Alka,
come mi hai detto funziona. Però se voglio aggiungere altri filtri (es. record con stato 'No') e sceglierli mediante una combobox come posso fare ??
ciao
Scusa per il ritardo nella risposta, ma sono stato un paio di giorni al Webb.it a Padova.
Puoi inserire nella ComboBox la descrizione testuale di tutti i filtri che metti a disposizione. Quando giunge il momento di applicare il filtro intercettando l'evento OnFilterRecord, puoi controllare quale filtro hai selezionato ispezionando la proprietà ItemIndex del controllo ComboBox e determinare, di conseguenza, il filtro da utilizzare. Cosa vuol dire utilizzare il filtro? Vuol dire usare un if...then per distinguere il filtro selezionato nella ComboBox e, per ciascuno di essi, ispezionare il valore dei campi per vedere se corrispondono alle restrizioni del filtro richiesto. In base all'esito del controllo che fai, imposti il parametro Accept passato all'evento a True se desideri accettare il record, oppure a False se vuoi scartarlo.
Spero di non essere stato troppo contorto.
Ciao!![]()
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
ciao Alka,
ho seguito le tue istruzioni, solo che il filtro mi funziona solo una volta. Quando vado a selezionare un nuovo filtro con la combo non succede nulla.
questo il listato della procedura onfilterRecord:
if form16.combobox1.itemindex=0 then
accept:=DataSet.FieldByName('stato').AsString = 'Si'
else
if form16.combobox1.itemindex=1 then
accept:=DataSet.FieldByName('stato').AsString = 'Si'
nella proprietà onchange della combobox:
filtered:=true;
Il tuo problema deriva dal principio di funzionamento del filtro.
Hai diversi modi per filtrare una tabella:
[list=1][*]utilizzare un componente TQuery che ti permette di estrarre dati da una tabella specificando i criteri di selezione attraverso uno statement SQL (soluzione consigliata);[*]specificare un filtro nella proprietà Filter seguendo determinate regole che puoi leggere nella Guida in linea di Delphi; l'impostazione della proprietà Filtered a True attiva il filtro; se vuoi cambiare il filtro, occorre impostare Filtered a False, modificare opportunamente la proprietà Filter e ripristinare Filtered a True;[*]utilizzare l'evento OnFilterRecord (come hai fatto tu); l'evento viene generato durante la fase di caricamento dei dati in cui, per ogni record, è possibile controllare il contenuto dei campi e stabilire se il record deve essere accettato oppure no.[/list=1]
Nella tua implementazione, siccome il filtro avviene giudicando ogni record in fase di "fetching" (reperimento), devi fare in modo che i record vengano ricaricati quando cambia il filtro. Prova a chiudere e riaprire la tabella quando l'utente seleziona un filtro diverso dal precedente dall'apposita ComboBox. In questo modo, si rende necessario reperire e filtrare nuovamente i record, ma verrà applicato il nuovo criterio selezionato.
Ti ho scritto anche altre soluzioni poichè l'uso dei filtri non è il metodo ottimale, in termini di prestazioni, per selezionare dei record, anche se è semplice da utilizzare. Il motivo è che devono essere ispezionati tutti i record (invece dei soli record interessati e selezionati tramite query, ad esempio) per poter decidere se sono validi oppure no.
Fai qualche prova, poi mi saprai dire.
Ciao!![]()
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
ciao Alka,
disattivando il database e riattivandolo funziona tutto.
grazie
Chiudi l'intero database? Non è un po' eccessivo? Basta la tabella.
O forse ti sei solo espresso male.
Ciao!![]()
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
ciao Alka,
se voglio utilizzare come filtro i valori selezionati da una dblookupcombobox come posso calcolare la accept nella procedura onfilterRecord??