Newsgroup: it.comp.lang.delphi
Titolo: Prefetching dati DBGrid

Sto tentando di risolvere questo problema:
Interfacciandomi tramite ClientDataSet con il DB in rete dal quale  
estraggo 100 record per volta, vorrei far si che, scorrendo i dati nella  
griglia, non debba aspettare che scatti la nuova interrogazione al db per  
i successivi records ogni qualvolta arrivo all'ultimo record, ma avere giï¿œ  
i dati successivi aggiunti in coda alla griglia tramite un meccanismo di  
prefetching, effettuato in un thread secondario, senza spostare il  
puntatore dal record sul quale sto transitando.
Non so se sono riuscito ad essere sufficientemente chiaro.
La configurazione:
- D2009
- Firebird 2.5
- WinXP
Vi ringrazio in anticipo.

 Non so se sono riuscito ad essere sufficientemente chiaro.
Ogni volta che cambi il record corrente, verifica quanto distante sei 
dall'ultimo o dal primo. Se quella distanza ï¿œ inferiore una tua soglia 
di warnign interna, ad esempio diciamo che sei sotto le 10 righe, fai 
la fetch nella direzione in cui ti trovi.
Esempio: tu fai la query di 100 righe all'inizio. Consideri una soglia 
di 20 righe.
Se l'utente si posta sul record posizione 85, allora scateni il fetch 
in avanti delle successive 100 righe.
Ciao
-- 
Morde

 avanti delle successive 100 righe.
Si, ok. Come approccio c'ero giï¿œ, ma la cosa che non riesco ad ottenere ï¿œ  
l'aggiunta delle nuove righe alla DBGrid senza spostare il cursore dal  
record sul quale mi trovo.
Quindi se mi posiziono sul rec.85 ed effettuo una nuova fetch di altri  
100, voglio aggiungere ai 100 che giï¿œ ho i nuovi 100 senza che mi accorga  
dell'operazione avvenuta in background ovvero come se i 200 records siano  
sempre stai lï¿œ.
Non so se...

 sempre stai lï¿œ.
MAh... non saprei. Forse tramite bookmarks e un bel 
disablecontrols/enablecontrols prima e dopo l'inject dei nuovi records 
dovresti riuscire.
Fammi sapere.
ciao
-- 
Morde


Come ha anche suggerito morde proverei con un bookmark
Andrea 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4831 (20100203) __________
Il messaggio � stato controllato da ESET NOD32 Antivirus.
www.nod32.it

 puntatore dal record sul quale sto transitando.
Puoi provare a creare un secondo Clientdataset con CloneCursor().
Leggendo
l'ultimo record di questo secondo CDS dovrebbe forzare il primo a
fare
i fetch di tutti i dati alla massima velocita' possibile mentre la
griglia
rimane nella sua posizione originale.
// untested
procedure apridataset( ClientDataSetOrig : TClientDataSet );
var
  ClientDataSetClonato : TClientDataSet;
begin
  ClientDataSetOrig.Active := True;
  ClientDataSetClonato := TClientDataSet.Create;
  try
    ClientDataSetClonato.CloneCursor( ClientDataSetOrig, False,
False );
    ClientDataSetClonato.Last;
  finally
  ClientDataSetClonato.Free;
  end
end;
ciao
Giacomo


Il ClientDataSet ha le propriet�/metodi PacketRecords,
FetchOnDemand, BeforeRowRequest ed altri similari
che sembrano interessanti per questa tua esigenza
(senza imbarcarsi con thread secondari)
Vedi nell'help per maggiori informazioni (tra cui un
esempio).
Ciao
ACSH
--- news://
freenews.netfront.net/
 - complaints: 
ne...@netfront.net
 ---