Newsgroup: it.comp.lang.delphi
Titolo: Perchè i dataset all'apertura..

...scaricano tutto il recordset sul client (fetch) automaticamente?
se desidero aprire un dataset solo per aggiungere o modificare un record
come si puo' evitare di scaricare l'intero recordset?
Addiruttura con una ADOTable su una tabella di molti record il client
inizia a swappare continuamente ( la memoria utilizzata dal processo 
addirittura si raddoppia)...questo comportamento mi sembra perlomeno 
eccessivo se desidero aprire il dataset solo per mettere lo stesso in 
dsAppend o dsEdit e quindi per manipolare UN SOLO record!.
sono sicuro di essere io l'errore (in questo caso) :)
grazie,
FBI
p.s. uso datacontrol dbaware quindi è da escludere a priori l'utilizzo 
di ADOQuery con insert e update statement.

 di ADOQuery con insert e update statement.
...ma non delle ADOQuery in generale: magari non ci hai fatto caso, ma 
le TADOQuery sono sempre e comunque aggiornabili.
Se invece di una ADOTable, per selezionare un record sulla tabella usi 
una TADOQuery, poi puoi collegare ad essa i controlli DBAware e fare 
quello che ti serve.
Fai attenzione, però: il fatto che tu possa modificare i dati restituiti 
da una adoquery è comodo nel tuo caso, quando cioè selezioni da una sola 
tabella, ma non lo consiglio nel caso la query ritorni il join tra più 
tabelle.
Ad esempio
   select *
   from ORDINI O inner join CLIENTI C
     on O.codicecliente = C.codicecliente
ti ritorna gli odini di tutti i clienti, ciascuno affiancato dai dati 
del cliente.
Poniamo il caso che tu modifichi a mano il codice cliente: su quale 
tabella deve avere effetto la modifica? ORDINI o CLIENTI? O entrambe?
Per dataset raggruppati quindi non ne approfitterei: BDE aveva la 
property RequestLive che andava automaticamente a False, ADO non dice 
niente però...
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it
P.S.
Ho anche provato a fare un programma veloce con una ADOQuery che 
seleziona un record su una tabella di un db access e un dbedit che 
mostra i dati di un campo: se modifichi i dati sul dbedit e con un 
bottone chiami il metodo post della Adoquery, poi vedi le modifiche 
anche sul db.

Grazie Marco,
quindi tu confermi che il fetching dei dati avviene automaticamente 
all'apertura del dataset. Non esiste nessun meccanismo che consente di 
eseguire il fetch dei dati programmaticamente.
Quello che mi interessa è mettere il dataset in edit o in append o in 
insert senza scaricarmi necessariamente alcun record dal db.
Non capisco perchè ADOTable deve tirarsi giu' l'intera tabella dal db 
quand faccio .open() se l'oggetto ADOTable mi occorre solo per editare o 
aggiungere un record.
Uno spreco.
saluti Fascox.
Marco Bortolani ha scritto:


 Uno spreco.
Ehm... i controlli Table in Delphi (TTable, TADOTable, ecc..) sono fatti 
apposta per contenere /*tutti*/ i dati della tabella cui vengono 
collegati :-)
Quando apri il dataset, che a te poi serva un solo record Delphi non lo 
può sapere... probabilmente se lo sapesse ti direbbe: "Ma perchè non usi 
una query invece di una table?"
Per eseguire l'editing o l'append senza scaricare dati, creerei un 
wizard con tanti TEdit quanti sono i campi da popolare e al momento 
della conferma lancerei una query di insert o l'update con i dati raccolti:
	update ORDINI
	set descrizione = Edit1.Text
	where idordine = Edit2.Text
Ne chiami il metodo ExecSQL e il gioco è fatto, a patto poi di 
rieseguire le varie query/table che contengono i dati della tabella 
modificata.
Vedi tu: le possibilità non mancano, ma quella dell'uso delle Table 
secondo me la devi accantonare.
	Marco
	info @ 
marcobortolani.it

 tabella deve avere effetto la modifica? ORDINI o CLIENTI? O entrambe?
Per questo genere di problema c'è una proprietà del dataset ADO che si 
chiama 'Unique Table' che consente di specificare a quale tabella si fa 
riferimento (ad esempio nel delete di una riga di una join...)
Per il problema dell'OP direi che sarebbe meglio usare un ADODataset (o 
al limite ADOQuery, le ADOTable le scarterei a priori) e impostare il 
CursorType a ctKeySet specificando anche il criterio di update se serve 
(la proprietà si chiama 'Update Criteria').
Le proprietà vanno settate nell'evento OnCreateDataset.
HTH,
-- 
Andrea /\/\agni
www.delphiedintorni.it

 
Grande dritta :-)
Thx
	Marco

forse sono infelice nell'esprimermi, ma il problema
non è a quali dati fa riferimento la TTAble o ADOTable
(era scontato che ci riferissimo a tutte le righe di una tabella, giusto 
per chiarirci)...il problema che pongo io riguarda il fetching di questi 
dati e cioè la possibilità o meno di 'governare' il trasferimento delle 
righe dal server a client in modo piu' efficiente. Mi sembra uno spreco
visto che l'apertura di questo dataset mi occorre solo per inserire o 
modificare un record!...in un altro forum cmq un buon suggerimento per 
risolvere il mio dilemma me lo hanno dato (anche i vs. sono validi 
ovviamente) il suggerimento consiste nell'aprire un dataset vuoto
(es. SELECT * FROM TABLE WHERE 1=0) e quindi usarlo in dsEdit o dsInsert
...saluti Fascox
Marco Bortolani ha scritto:
