Newsgroup: it.comp.lang.delphi
Titolo: dbEpxress - PacketRecords e indici

Salve a tutti.
Ho creato un'applicazione con D6 + dbexpress + Firebird 1.0.3.
Ho una tabella generica che visualizzo un una form con un normale dbgrid, il
collegamento con i dati è stato fatto con:
SQLdataset (connesso a una tabella) -> DataSetProvider -> ClientdataSet ->
DataSource -> DBGrid (ovviamente in cima alla lista è presente il componente
per la connesione al DB, il file gdb).
Leggendo in vari post, questa "catena" di componenti è necessaria poichè
l'utilizzo del SQLClientdataset non garantisce un buon risultato (ho
verificato pure io, ogni tanto non è aggiornato correttamente nella
visualizzazione della griglia).
Veniamo al mio problema:
Per poter cambiare ordinamento di visualizzazione alla griglia in questione
ho creato degli indici tramite la proprietà indexdefs del ClientDataSet ed a
run-time "ciclo" su quegli indici con un pulsante per poter vedere a video
il cambio di ordinamento. Per poter fare questo però sono costretto a
settare il PocketRecords a '-1' in quanto nel passaggio da un indice
all'altro viene creato dal componente l'ordinamento e lo fa su tutti i
record "scaricati" in locale (e con PocketRecord a -1 vengono presi tutti).
Ora però mi si pone un problema di pesantezza della griglia, come posso
modificare il sw ?
Con una query (che quindi mi prende solo certi record che blocco con una TOP
50 ad esempio) e poi gli indici li faccio in modo analogo ?
Grazie


Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

 fai un esempio semplice e pratico, tanto per capire meglio.
Il problema è gestire le ricerche sul campo voluto che eseguo con una locate
sul dataset visualizzato.
In pratica con un button visualizzavo un TEdit in cui l'utente inserisce il
valore cercato, tramite una locate arrivavo al record voluto, ma questo
riesce se ho tutti i record "in locale" (packetRecords = -1), se limito meno
record (p.e. packetrecrods = 50) non riesco ad arrivare al record e se
riesco è perchè viene forzato lo scarico di tutti i record.


 lo scarico di tutti i record.
Beh, trovo sia normale tutto questo: se scarichi all'interno di una
tabella - rappresentata dal ClientDataSet - un totale di 50 record, la
ricerca sarà estesa solo a quei 50 record poichè gli altri sono rimasti
sul server, filtrati attraverso uno statement SQL appropriato oppure
rifiutati dal tuo ClientDataSet poichè superano la capienza impostata.
Che tipo di dati devi visualizzare?
Volendo si può agire d'astuzia...ad esempio, se si tratta di
un'anagrafica, potresti inserire la griglia all'interno di un TabControl
con una pagina per ogni lettera dell'alfabeto.
La selezione di una lettera, in modo simile alla rubrica telefonica,
seleziona tramite query SQL tutti quei record che hanno il nome con
quella lettera iniziale; la ricerca verrà applicata solo ai record
ottenuti, ma è giusto e normale che sia così (ed è intuibile anche a
livello di interfaccia).
In aggiunta, potresti creare una pagina con un "*" che seleziona tutti i
dati in modo che l'utente possa cercare all'interno di tutti i record
disponibili ma che sia, nel contempo, consapevole che andrà a scaricare
una ingente mole di dati e dovrà attendere qualche istante prima di
poter riprendere il controllo del programma.
Si tratta solo di un esempio; magari, la tua base dati è diversa ma
questo metodo può essere adattato creando qualcosa di simile.


 posso modificare il sw ?
Per effettuare l'ordinamento dei dati utlizza il buon vecchio metodo di
cambiare l'order by della Query.
Ti consiglio di lasciare impostato il PacketRecord in modo che l'output dei
dati sia veloce.
Una soluzione che abbiamo trovato è quella di creare un componente (sempre
se riusciamo a risolvere un problema con un thread capito Andrea??:) che
scarica in modo asincrono i dati sul cds che hanno packetRecord>0 in modo da
aprire il cds velocemente e poi scaricare i dati in modo che l'utente quando
naviga se li trova già pronti.
--
ciao
   gabriele

 se riusciamo a risolvere un problema con un thread capito Andrea?? :) 
Sempre a lamentarsi... ... ... :)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it