Newsgroup: it.comp.lang.delphi
Titolo: Filtro su dataset funziona male

Ho un DBGrid con una sola colonna che uso come un listBox. Digitando in un 
edit riduco le righe del DBGrid a quelle che corrispondono alla stringa 
digitata.
La procedure che gestisce la ricerca č semplice e funziona perfettamente 
fino a che non cancello la stringa digitata nell'edit e ricomincio con 
un'altra ricerca. In questo caso la ricerca non funziona piů. Per spiegarmi 
meglio, ecco le istruzioni:
 
procedure TForm9.Edit1Change(Sender: TObject);
begin
  Table1.Filter := '';
  Table1.Filtered := Edit1.Text <> '';
end;
 
procedure TForm9.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
    Accept := Pos(UpperCase(Edit1.Text), 
UpperCase(DataSet.Fields[0].AsString)) > 0;
    if Accept then
      exit;
end;
 
Ho verificato che la seconda volta che digito un carattere nell'edit, 
l'OnChange viene attivato, ma non viene piů attivato l'OnFilterRecord. 
Perchč e come posso fare ? 
 

 Perchč e come posso fare ?
 
Questo potrebbe andarti bene, di certo qualcuno piu' esperto puo' darti 
soluzioni migliori.
 
Ciao
 
Daniele
 
 
 
 

Daniele, sei praticamente l'unico che anima questo gruppo e se non altro ti 
ringrazio anche solo per questo.
Relativamente l problema che ti ho esposto, effettivamente ho riscontrato 
che è proprio come dici tu: non funziona una seconda volta perchè l'evento 
non viene chiamato. Potrei cambiare soluzione come suggerisci, ma mi sono 
intestardito a far funzionare quella che mi pareva così semplice (in fondo è 
solo una riga.) e allora, non c'è un modo di scatenare l'evento da programma 
?
Altra domanda di carattere più generale: Nella prospettiva di cambiare 
metodo di accesso e database (uso il BDE), secondo te sarebbe meglio magari 
usare delle query piuttosto che dei filtri ? 
 

 magari usare delle query piuttosto che dei filtri ?
Io uso TurboDB per le mie tabelle e mi interfaccio con un db di terze parti 
che e' un firebird 2.5.
Per il locale (turbodb) uso filter, mentre per firbird uso sql (ma nulla 
vieta di usare anche qui il filter).
diciamo che sql e' molto comodo quando ho piu' dati da ricercare in diverse 
tabelle, con la join puoi creare (al volo) una sorta di "tabella" 
personalizzata con i dati che realmente ti servono.
 
Alla prossima
 
Ciao
 
Daniele 
 

 Perchè e come posso fare ?
 
procedure TForm9.Edit1Change(Sender: TObject);
begin
  Table1.Filter := '';
  if Edit1.Text <> '' then
  begin
    Table1.Filtered := false;
    Table1.Filtered := true;
  end;
end;
 
-- 
Oggi c'e' una grande battaglia di idee,
ma alla fine non ci saranno ne vinti,
ne vincitori, ne idee! S. Benni da Elianto.

end;
 
Secondo me quel Table1.Filter:='' non va bene ....
Se ogni volta che si preme un tasto il filtro viene resettato ..... anche se 
nell'altro evento si verifica la condizione ( pos(.....)>0) .... la tabella 
che filtro applica ????
Nessuno perche' filter e' vuoto ('').
Secondo me dev'essere un qualcosa del genere
 
if edt1.text<>'' then filter:=edt1.text
else
filter:=''
 
Alla prossima ...
 
Ciao
 
Daniele
 


guarda io non ti so spiegare come ma un applicazione di prova con delphi 
6 con un form, adoconnection, adotable con un solo campo, datasource, 
dbgrid, tedit e questi 2 eventi
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
     Table1.Filtered := false;
     Table1.Filtered := true;
end;
 
procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
   var Accept: Boolean);
begin
     Accept := Pos(UpperCase(Edit1.Text), 
UpperCase(DataSet.Fields[0].AsString)) > 0;
end;
 
funziona perfettamente!


Ciao,
 
[Inizio quote]
guarda io non ti so spiegare come ma un applicazione di prova con delphi
6 con un form, adoconnection, adotable con un solo campo, datasource,
dbgrid, tedit e questi 2 eventi
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
     Table1.Filtered := false;
     Table1.Filtered := true;
end;
 
procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
   var Accept: Boolean);
begin
     Accept := Pos(UpperCase(Edit1.Text),
UpperCase(DataSet.Fields[0].AsString)) > 0;
end;
 
funziona perfettamente!
 
[Fine]
 
Non entro nel merito ... se va ...va ....
 
Pero' le 2 procedure non sono uguali ...
questa e' la tua originale
 
procedure TForm9.Edit1Change(Sender: TObject);
begin
  Table1.Filter := '';  <---- ***
  if Edit1.Text <> '' then
  begin
    Table1.Filtered := false;
    Table1.Filtered := true;
  end;
end;
 
Nella seconda che hai spostato non c'e' la riga indicata.
 
Rimane un mistero, invece, sul perche' funzioni il filtro se non e' 
aggiornata la property filter ....
Ma questo e' un mistero che tale deve rimanere ...
 
Ciao
 
Daniele