Newsgroup: it.comp.lang.delphi
Titolo: Filtraggio di una tabella

Ho riscontrato un curioso (mal)funzionamento dell'evento
OnFilterRecord (OFR) sugli oggetti TTable: in base alla documentazione
l'evento dovrebbe essere generato solo se la proprieta' Filtered e'
True, invece sembra che cio' avvenga solo per gli spostamenti sul
database, mentre per ogni operazione di scrittura sul databse (quindi
modifica, aggiunta o cancellazione di records) l'evento viene generato
qualunque sia il valore di Filtered. In piu' il metodo Close, se
l'ultima operazione precedente e' stata di scrittura, genera anch'esso
un'evento OFR a tabella chiusa!!
E' un po' astruso da capire, cerco di spiegarmi meglio con esempio:
segno con (!!) i comportamenti impropri.
La versione di Delphi e' 5.0 Pro UP1.
Per comodita' all'evento OFR dell'oggetto Table:TTable e' associata
una funzione che ritorna sempre Accept:=True.
[...]
Table.Filtered:=True;
Table.Open;		//genera OFR
MuovitiSuMuovitiGiu;	//genera OFR
ModificaDati;		//genera OFR
Table.Close;		//genera OFR se preceduto da ModificaDati!!
Table.Filtered:=False;
Table.Open;		//NON genera OFR
MuovitiSuMuovitiGiu;	//NON genera OFR
ModificaDati;		//genera OFR!!
Table.Close;		//genera OFR se preceduto da ModificaDati!!
[...]
Il problema grave e' che nell'evento generato dal Close il filtro
viene verificato su una tabella chiusa, causando serie di errori
dovuti all'impossibilita' di accedere ai campi prestabiliti.
Come ho risolto?
Nella procedura di filtraggio verifico il valore di Filtered.
Certo influira' sulle prestazioni, ma non ho trovato altro.
procedure TfmData.TableFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  if Table.Filtered=False then Accept:=True
  else Accept:=ApplicaFiltro;
end;
Prima di ogni Close ho aggiunto un finto movimento in modo che
l'evento non venga piu' generato:
Table.Bookmark:=Table.Bookmark;
Table.Close;		//NON genera piu' OFR
Se qualcuno sa darmi una spegazione piu' scientifica del fatto e' il
benvenuto.
- Mariano La Via.-

>
Ho riscontrato un curioso (mal)funzionamento dell'evento
OnFilterRecord (OFR) sugli oggetti TTable: in base alla documentazione
l'evento dovrebbe essere generato solo se la proprieta' Filtered e'
True, invece sembra che cio' avvenga solo per gli spostamenti sul
database, mentre per ogni operazione di scrittura sul databse (quindi
modifica, aggiunta o cancellazione di records) l'evento viene generato
qualunque sia il valore di Filtered. In piu' il metodo Close, se
l'ultima operazione precedente e' stata di scrittura, genera anch'esso
un'evento OFR a tabella chiusa!!
[...]
Il problema grave e' che nell'evento generato dal Close il filtro
viene verificato su una tabella chiusa, causando serie di errori
dovuti all'impossibilita' di accedere ai campi prestabiliti.
[...]
<<
Per _risolvere_ il problema della chiusura hai provato a mettere Filter :=
''; e/o OnFilterRecord := nil; e/o Filtered := False; in BeforeClose?
TBDEDataSet.InternalClose: a occhio un DeactivateFilters non ci starebbe
male.
Saluti
Paolo Arosio

male.
In BeforeClose no. L'ho messo prima, l'ho monitorato e restituisce
False. OnFilterRecord:=nil potrebbe essere una buona idea, ma mi
complicherebbe la vita nella riapertura, perche' dovrei controllare se
devo ripristinare il filtraggio o meno.
Del DeactivateFilters non conoscevo nemmeno l'esistenza, ora me lo
vado a cercare.
Comunque non capisco il motivo di questo strano comportamento.
Bye.
- Mariano.-