Newsgroup: it.comp.lang.delphi
Titolo: cancellare un record in una DBGrid

Ciao a tutti, ho una DBGrid che accede a due tabelle Access tramite una
query che abbina al codice preso dalla tabella movimenti che ho inserito,
il nominativo del cliente prelevandolo dalla sua anagrafica (è una
relazione uno-molti). Quando inserisco un nuovo movimento è tutto ok,
metto il codice e mi compare il nome; invece quando devo cancellare un
movimento non accetta la cancellazione per violazione di chiave. Ho
pensato che forse non me lo fa cancellare perchè i record della DBGrid
derivano da una query, quindi dovrei fare una DBGrid con solo i dati della
tabella movimenti senza l'abbinamanto con l'altra tabella nominativi. Cosa
mi consigliate?
Grazie.
---------------------------------------------------------------------------
Messaggio inviato attraverso 
http://www.trucchiperpc.it
 - sezione newsgroup

relazione uno-molti). 
Chiariamo: le TDBGrid si limitano semplicemente a interfacciare, via
TDataSource, un TDataSet e mostrare i record in esso contenuti.  
Suppongo che la tua query sia una join tra la tabella dei movimenti e
quella dei clienti, prelevando la ragione sociale del cliente in base
al codice memorizzato nella tabella dei movimenti.  Devi però
specificare che tipo di componente stai utilizzando per le query (è un
TQuery ? un TADOQuery ?).  Le query, per definizione, non sono
modificabili.  Anche rendendo il result set "live", può capitare (la
join è uno di questi casi) che si debba ricorrere a un componente di
aggiornamento esterno (es.: TUpdateSQL).

 mi consigliate?
L'uso delle Query è sempre preferibile alle Table.
Mi chiedo se quando cancelli agisci sulla Query ?
Utilizzi la proprietà datasource della query ?
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

L'uso delle Query è sempre preferibile alle Table.
Non sempre, dipende dai DB.  Per Paradox, ad esempio, è sempre meglio
usare le TTable.

Per la query uso una ADOQuery e il codice SQL lo scrivo direttamente nella
proprietà SQL della query perchè non cambia mai; poi a runTime chiamo il
metodo ADOQuery1.Open e la DBGrid mi visualizza la lista completa.
Ho fatto diverse prove è ho visto che è possibile cancellare da una DBGrid
un record, basta che non provenga da una query su più tabelle, ecco perchè
c'è la violazione di chiave.


c'č la violazione di chiave.
Non capisco perň cosa c'entri la "violazione di chiave".  Se devi
cancellare il record dei movimenti, devi semplicemente eseguire una
DELETE in SQL.  Dopo, perň, devi fare un refresh dei dati
dell'ADOQuery, chiudendola e riaprendola.


Falso dipende dal sistema.
Le tTable possono non girare se compilate su uno dei 3 sistemi :
WinNT
o 98
o 95.
e installati in un altro.
Se sostituisci le tQuery invece gira. E questo mi è accaduto proprio con
Paradox 7.
Ciao.


A me sembra che quello che può accadere è che viene cancellato il record
'Detail' e non il Master. O viveversa.
Dovrebbe esistere un campo autoincrementante.


Paradox 7.
Le TQuery con Paradox sono assolutamente da evitare.

'Detail' e non il Master. O viveversa.
Non può essere, se c'è una join, il result set non è live, quindi non
puoi cancellare nulla.  Bisogna necessariamente eseguire due query di
cancellazione distinte, prima sul dettaglio, poi sul master.

Punto 1 Ti stimo per cui non capisco.
Punto 2 a me gira se a VOI no.
Non so che dire.
Ciao


Il primo post parlava di 1 cancellazione.
Ma comunque mi prendo una vacanza.
Ciao.


Punto 2 a me gira se a VOI no.
Questa non l'ho capita.

Ma comunque mi prendo una vacanza.
...sarà meglio ;-)