Newsgroup: it.comp.lang.delphi
Titolo: Dubbio sull' applyupdate

Mi hanno dato un db interbase dove i valori chiavi primarie 
son generate tramite trigger.
Con delphi se mi interfaccio al db con un clientdataset 
quando inserisco un nuovo record non ho il valore della pk 
fino a che non faccio Cds.ApplyUpdates(0) e fin qui va 
bene... tuttavia a me serve il valore della pk dell'ultimo 
rekord che ho immesso.Ho pensato che il cursore del 
ClientDataset rimanesse sull'ultimo rekord inserito quindi 
in teoria il valore ultimo inserito e' quello.
E' giusta sta cosa o esistono metodi alternativi?
In pg e mysql so come fare tramite query sql... tant'e' che 
in php c'e' addirittura la funzione. non e' che ce' anche in 
delphi :-P
ps
tutto cio' su D2006.

 valore ultimo inserito e' quello.
In genere, è preferibile generare l'ID lato client in modo che, nel 
momento in cui le modifiche apportate al record (inserimenti, 
aggiornamenti e cancellazioni) possano essere sincronizzate usando 
quella chiave primaria come "gettone di identificazione" consentendo al 
DataSetProvider di recuperare dal database sottostante, una volta 
applicate le operazioni di aggiornamento, i dati aggiornati.
Ad ogni modo, non ho capito se hai riscontrato un problema effettivo con 
la tua implementazione. :-|
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)
     Non hai la possibilità di scaricare Turbo Delphi Explorer?
     Te lo spedisco io!! [
http://www.marco.breveglieri.name/?p=48
]

 In pg e mysql so come fare tramite query sql
In pg hai il nextval() e in MySQL hai LAST_INSERT_ID().
In Interbase/Firebird, devi generare il valore prima, usando appunto il
generator:
select GEN_ID(tuo_generatore, 1) from RDB$DATABASE
E usare questo per l'insert.
Assicurati che il trigger non generi sempre un valore, ma solo se il
valore passato č null.  Il codice corretto del trigger č:
if new.tuo_id is null 
  new.tuo_id = gen_id(tuo_generatore, 1);
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 la tua implementazione. :-|
E ora devo inserire automaticamente dei record dentro piu' 
tabelle relazionate fra loro... Visto che non e' possibile 
reperire l'id inserita tramite quel malefico Trigger(per me 
e' errato inserire il valore della pk tramite trigger) ho 
cambiato la procedura incrementando i generatori (con query 
suggerita dal Laforgia) dal client  al momento del 
applyupdate e cosi va tutto.
Ultimamente avevo lavorato con altri db e mi ero ritrovato 
spiazzato(c'ero rimasto di me**a)...
Ciao && grazie per l'aiuto
p

e' errato inserire il valore della pk tramite trigger) 
Non è errato.  Il trigger invece è utilissimo allo scopo ed è una
scelta anche abbastanza intelligente rispetto ad altri DB.

 scelta anche abbastanza intelligente rispetto ad altri DB.
Non ho capito come fare a prendere il valore che ho inserito 
tramite trigger, se e' possibile fammelo sapere, se non e' 
possibile recuperarlo per me non vanno usati.!

possibile recuperarlo per me non vanno usati.!
Il fatto che tu non riesca a risolvere un problema, non vuol dire che
Firebird o Interbase abbiano un problema.  I trigger sono degli
strumenti utilissimi che VANNO usati.  Ti stai inventando una falsa
necessità: tu non hai bisogno di recuperare il valore generato tramite
trigger, tu hai bisogno di recuperare il "next id" autoincrementato e
ti è stato già detto come fare.  Punto.  Per il resto, creare un campo
incrementante tramite trigger è utilissimo tanto quanto usare altri
metodi presenti in altri DB (e che sono sostanzialmente equivalenti,
vedi Postgres e Oracle).

 ti è stato già detto come fare.
Ho capito solo ora perke' mi avevi scritto assicurati che 
generi il valore solo se riceve null!!
:-D
Ciao ciao