PDA

Visualizza la versione completa : [Delphi]: filtrare i record


elevation
05-07-2002, 18:20
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

alka
06-07-2002, 02:00
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:


procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept := DataSet.FieldByName('stato').AsString = 'Si';
end;


Ciao! :ciauz:

elevation
06-07-2002, 15:25
ciao alka,

provo come mi hai detto

ciao e grazie

elevation
06-07-2002, 16:57
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

alka
07-07-2002, 22:29
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! :ciauz:

elevation
08-07-2002, 11:30
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;

alka
08-07-2002, 11:53
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! :ciauz:

elevation
08-07-2002, 12:26
ciao Alka,

disattivando il database e riattivandolo funziona tutto.

grazie

alka
08-07-2002, 12:36
Chiudi l'intero database? Non è un po' eccessivo? Basta la tabella.
O forse ti sei solo espresso male. :)

Ciao! :ciauz:

elevation
08-07-2002, 12:41
ciao Alka,

se voglio utilizzare come filtro i valori selezionati da una dblookupcombobox come posso calcolare la accept nella procedura onfilterRecord??

Loading