Newsgroup: it.comp.software.database
Titolo: firebird select @@identy e select GEN_ID

ciao
db firebird +
adonet + dataadapter
come recuperare il campo genererato da ? :
triggers before insert:
  if (new.idscontrino is null) then
     new.idscontrino = gen_id(gen_scontrinomaster_id,1);
in mssql:
evento
dataadapter.rowupdated
select @@identity
( o SCOPE_IDENTITY )
recupero il valore "esatto" anche in caso di più utenti
in firebird
dataadapter.rowupdated
"select GEN_ID(ID_SCONTRINO_ID, 0) as id from RDB$DATABASE";
(0 perché prendo valore già incrementato)
non funziona in caso di più utenti (ho provato)
soluzioni ? (se possibile senza "stravolgere la logica")
ciao e grazie
ps
posto in microsoft.public.it.dotnet.ado e in 
microsoft.public.it.dotnet.ado perchè non mi è chiaro quale scegliere

 soluzioni ? (se possibile senza "stravolgere la logica")
non devi usare il trigger :-(
Il fatto che fb non gestisse sessioni e last_insert_id() 
come mysql e altri a suo tempo mi aveva fatto incazzare :-D
GEN_ID(generatorname, 0) Questo riporta il valore attuale.
Se un altro utente ha fatto la stessa cosa ti riporta un 
altro valore, quindi in multiutenza e' una schifezza...
The best way is to fetch the value first, then use the value 
for subsequent inserts.
La via migliore e' questa:
crei il valore nuovo salvi in una variabile il valore e lo 
usi per la insert e altre eventuali query che inseriscono 
dati relazionati a quella chiave.
SELECT GEN_ID(mygenerator, 1) AS NEW_VALUE FROM RDB$DATABASE
INSERT INTO ... VALUES (NEW_VALUE, ...)
Ciao, spero di esserti stato di aiuto!
-- 
my blog
http://blog.bpcsoluzioni.com
php snippets
http://phpsnippets.lynksee.com/blog/

 Ciao, spero di esserti stato di aiuto!
Da qualche parte avevo letto che neanche questo era sicuro al 100% a
livello di multi-utentenza.
Io uso il primo sistema, ma prima locko da programma l'accesso a quella
tabella, e quindi l'inserimento avviene sempre uno per volta.

 livello di multi-utentenza.a.
ti sbagli. la select da generatore e' sicura.

 ti sbagli. la select da generatore e' sicura.
http://www.firebirdsql.org/manual/generatorguide.html#generatorguide-intro

 
http://www.firebirdsql.org/manual/generatorguide.html#generatorguide-intro
Avevo letto qualcosa del genere, se potete tradurlo:
http://www.volny.cz/iprenosil/interbase/ip_ib_code_generator.htm
*How to set generator in SP*
Because command SET GENERATOR ... TO ...; is not supported inside stored
procedures, the only way is to read current value in one GEN_ID call and
use it to adjust value by another one. (But be careful in multiuser
environment *because these two GEN_ID calls are not guaranteed to be
executed in one atomic operation* !)
Non ricordo se era questo però.
Anche a me torna che ad occhio funzioni anche in multiuser, ma avevo letto
una cosa tipo questa e rimasi al mio sistema.

 
http://www.firebirdsql.org/manual/generatorguide.html#generatorguide-intro

http://www.volny.cz/iprenosil/interbase/ip_ib_code_generator.htm


Ecco la traduzione:
http://eos.pi.it/Approfondimenti/Firebird/generatori.html
*Come assegnare, in una SP, un valore ad un generatore*
Dato che il comando SET GENERATOR … TO …; non è supportato all'interno di
una stored procedure, l'unico modo è quello di leggere il valore corrente,
tramite GEN_ID, ed utilizzarlo per la modifica (prestare attenzione al
fatto che in un ambiente multiutente due chiamate a GEN_ID non
costituiscono obbligatoriamente una operazione atomica). 

 
http://www.firebirdsql.org/manual/generatorguide.html#generatorguide-intro

http://www.volny.cz/iprenosil/interbase/ip_ib_code_generator.htm




Quindi dovrebbe essere relativo solo a quella chiamata con 2 gen_id:
val = GEN_ID (MyGen, val - GEN_ID (MyGen,0) );
Tutto ok sembrerebbe :)

 Tutto ok sembrerebbe :)
due gen_id sono atomiche per i fatti loro e basta. quindi quella riga di
codice potrebbe darti problemi.... non capisco bene a che serva pero' :/

> Ciao, spero di esserti stato di aiuto!
certo
avevo ipotizzato tale soluzione ma
l'idea base era
(se possibile senza "stravolgere la logica")
in modo poter cambiare db (mssql etc)
ok scrivo codice ...
ciao e grazie

 ok scrivo codice ...
Fidati, se vuoi usare al meglio un DB č meglio che ne sfrutti le
caratteristiche. In firebird ci sono troppi comandi che forse non sono
standard, COALESCE, NULLIF, la concatenazione con ||, CASE WHEN, CAST, io
ci ho rinunciato dopo poco, almeno che non decidi di fare ogni
stampa/elaborazione del programma tutto da codice e su tabelle temporanee,
con tempi di elaborazione di migliaia di volte superiori.
Ho corretto alcune stampe che facevano tutto da codice con una UPDATE lunga
sě un km, ma che elaborava migliaia di record in 5/6 secondi invece di
20/30min (in rete).

 la concatenazione con ||
Questa mi sa che e` piu` o meno standard (e non de jure, de facto)
Enrico

 Questa mi sa che e` piu` o meno standard (e non de jure, de facto)
Bhe non so, cmq un'altra č:
FROM MIATABELLA AS TAB
mentre firebird 
FROM MIATABELLA TAB

 FROM MIATABELLA TAB
Anche queste due forme dovrebbero essere standard (la prima e` un alias
esplicito, la seconda e` implicito)
Enrico