Newsgroup: it.comp.lang.delphi
Titolo: problemi con interbase

Ho il seguente problema che non so da che parte aggredire:
La tabella è quella sotto riportata:
con la sequenza
append
fieldbNane
post
scrivo tutti icampi
ebbene con bde è tutto ok
ma con i componenti interbase  mi da l'errore
"IDRUB deve avere un valore.."
Sono nello sconforto piu totale  :-(
CREATE TABLE "RUBRICA"
(
  "IDRUB" INTEGER NOT NULL,
  "TIPO" VARCHAR(10),
  "NOME" VARCHAR(40),
  "NOTE" VARCHAR(40),
 PRIMARY KEY ("IDRUB")
);
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER "GETNEXTG_RUBRICAIDRUBGEN2" FOR "RUBRICA"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  NEW.IdRub = GEN_ID(G_RUBRICAIdRubGen2, 1);
END

 "IDRUB deve avere un valore.."
Assegna un valore al campo IDRUB, ad esempio 0 (zero), anche se sai che 
esso verrà sostituito dal valore del generatore dal trigger di InterBase.
In generale, affinchè le cose funzionino a dovere con i database 
client/server, io solitamente acquisisco il valore del generatore dal 
server e lo attribuisco lato client al record sin da subito, evitando 
che questo venga assegnato direttamente dal server.
Il motivo è molto semplice: avendo lato client l'ID del record, è 
possibile reperire i suoi valori una seconda volta (eseguendo 
implicitamente una query selettiva); in caso contrario, devi chiudere e 
riaprire la tabella o la query sulla quale lavori per ottenere l'elenco 
dei record aggiornati con gli ID attribuiti dal server.
Ciao!
-- 
Marco «Alka» Breveglieri
  ABLS Team S.n.c. - Software & Web
  Via De Gasperi, 14
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

 END
poi con i seguenti statment sql puoi leggere senza incrementare il valore
del generator con
select gen_id (G_RUBRICAIdRubGen2, 0) from rdb$database
oppure leggere e incrementare di uno
select gen_id (G_RUBRICAIdRubGen2, 1) from rdb$database
ed eventualmente reimpostare il generator ad un dato valore con
set G_RUBRICAIdRubGen2 to valore
-- 
Ciao, Anto', [37, 143, AQ] 
MB C SC 220 CDI Magma Rot
"Di sempre cio' che senti e fai cio' che pensi."
    G.G. Màrquez

 set G_RUBRICAIdRubGen2 to valore
come sopra.
AS

 AS


 del generator 
Qual č lo scopo di ottenere il valore di un generatore senza 
incrementarlo? :-)


Ottenre l'ultimo valore generato tipo select @@identity di m$sql.
AS

> ma chi ha parlato di id globali o di sessione!?
Anto, scusa.
Se scirvi quel sql ottine l'ultimo id creato dal generator giusto?
Ora, tu stai su pc1 e crei un id. Nell'istante che impieghi a eseguire 
la query la tua collega al pc2 fa la stessa operazione e usa il 
generator prima che tu abbia letto il valore generato da te.
Ora tu leggi e cosa ottieni? ovviamente l'id richiesto da pc2 e non 
quello richiesto da te.
In sintesi: non puoi avere la certezza che l'id letto con la query dalle 
tabelle di sistema di ib sia quello che *tu* hai generato.
La sessione c'entra semplicemente xche ib60 non le ha.
Ad esempio, se usi gli autoinc su m$sql e fai un insert, dopo con:
select  @@identity
ottieni l'ultimo autoinc generato nella *sessione di lavoro corrente*, 
cosa che ti mette al riparo dal problema di cui stiamo parlando.
Per la cronaca in firebird è stato introdotto il concetto di sessione.
Cia'! ;)
AS

 Ottenre l'ultimo valore generato tipo select @@identity di m$sql.
Ho capito - nella pratica - in cosa consiste, ma non ho ben capito quale 
può essere la sua utilità in generale in una comune applicazione. :-)


 Cia'! ;)


 può essere la sua utilità in generale in una comune applicazione. :-)
mha, che dirti!
Io non l'ho mai usato, però spesso ho letto di qualcuno che chiedeva come
farlo, anche sui ng di Cantù, e poi se la feature c'è, evidentemente
qualcuno ha pensato possa essere utile ;o)


 sempre e solo di valori del generator e mai di id globali o di sessione.
Infatti, sono stato *io* a introdurre la storia di sessioni etc.
Sintetizzo il concetto..
non è detto che questa select:
select gen_id (G_RUBRICAIdRubGen2, 0) from rdb$database
restituisca l'ultimo valore usato da chi sta eseguendo la suddetta 
select xche nel frattempo qualcuno potrebbe averne generati altri.
Quindi, usare questa select come meccanismo per dare visibilità al 
client dell'id generato può provocare dei casini.
AS