Newsgroup: it.comp.lang.delphi
Titolo: Ancora campi autoincrement e Firebird

Facendo seguito al non esaustivo caso presentato da Vanni il 27/12/2006,
vi presento il mio problemino. Uso Firebird con Delphi 7.0.
Ho due tabelle Master-Slave, la Master TABELLA1 e la Slave TABELLA2
legate dal ID1, integer autoinc, chiave primaria di TABELLA1 e chiave
esterna di TABELLA2.
Quando faccio un inserimento dati per un record di TABELLA1 e un
record di TABELLA2 (inserimento immediato e consecutivo), devo 
necessariamente conoscere subito l'ID assegnato al nuovo record di 
TABELLA1 per poterlo mettere nell'opportuno campo di TABELLA2.
Nel database Firebird ho creato ovviamente un generator per ID_TABELLA1 
e un trigger BEFORE INSERT, che avanza sempre di 1 il generator con 
GEN_ID().
Inoltre varie ricerche su Google mi hanno condotto a creare una stored 
procedure da me chiamata GIVEID che mi mettesse a conoscenza dell'ultimo 
ID concesso dal DBMS alla tabella, così configurato:
CREATE PROCEDURE GIVEID
RETURNS (
     VALORE Integer )
AS
BEGIN
   SELECT DISTINCT(GEN_ID(ID_GEN, 0))
   FROM TABELLA1
   INTO :VALORE;
END^
Ora, la mia idea per la parte Delphi era quella di lavorare in AfterPost 
di Tabella1 con una procedura così disegnata:
//-----
  GiveID.Prepare;
  try
     GiveID.ExecProc;
     ID := GiveID.Params[0].AsInteger;
  finally
     GiveID.UnPrepare;
  end;
  IBTransaction.CommitRetaining; //non chiude la tabella dopo il Commit
  TABELLA1.Refresh;
  TABELLA1.Locate('IDPost',ID,[]);
//-----
In questo modo potrei avere già la TABELLA1 posizionata sul nuovo record 
completo di ID generato e leggibile da programma.
Il problema è che il Post viene chiamato anche da un Edit della tabella 
e io non voglio che dopo un edit la tabella si posizioni sull'ultimo 
record generato. Ma dal AfterPost io non ho modo di sapere se era il 
post di un edit o di un insert.
Ho pensato anche di modificare la procedura ed eseguirla nel BeforePost, 
ma non può funzionare perché la sua seconda parte, quella con il refresh 
e il locate, deve essere per forza eseguita dopo il post.
Qualcuno si prenda a cuore il mio caso e mi consigli un modo elegante di 
risolvere questo problema.
NOTA: in teoria il problema di leggibilità delle chiavi primarie 
generate dal DBMS dovrebbe essere molto molto importante e comune nella 
programmazione con Firebird. Io ho cercato molto sui newsgroup da Google 
e sulla documentazione Firebird/Interbase. Non ho trovato nulla. Strano.

 e sulla documentazione Firebird/Interbase. Non ho trovato nulla. Strano.
Infatti è strano: hai probabilmente cercato male. Questo problema è stato
discusso mille volte, qui dentro e altrove.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Mah?

 Mah?
Mah che?. Cerca.


 
OK, lo farò.
Grazie LaForgia.

l'aggiornamento dei dati sul server, tale ID viene ri-assegnato?
Non se il trigger di before insert è impostato correttamente, ovvero
se assegna il nuovo valore a new.tuoId se e solo se vale null.
Generalmente il trigger di BI che sfrutta il generatore si scrive
(pseudo-codice, che non ricordo gli statement esatti di SQL di FB):
if (
new.id
 is null) then
begin
 
new.id
 = gen_id(tuoGeneratore, 1);  
end;