Newsgroup: it.comp.lang.delphi
Titolo: [Firebird]: leggere e incrementare un generatore

Salve, con Firebird avrei la necessità di leggere e incrementare il valore
di un generatore tramite una query.
Ho visto che all'interno di una stored procedure è possibile usare la
funzione Gen_Id(), però non può essere chiamata da una query e non è
nemmeno possibile passare alla Gen_Id() il nome del generatore attraverso
il parametro della stored, perciò per evitare di fare così:
if(:NomeGen='Gen1') then
  NumGen=Gen_Id(Gen1,1);
if(:NomeGen='Gen2') then
  NumGen=Gen_Id(Gen2,1);
if(:NomeGen='Gen3') then
  NumGen=Gen_Id(Gen3,1);
[...]
Come posso risolvere il problema?
Grazie in anticipo.
Auguri di buone feste.
Alessandro
--- posted by geoForum on 
http://www.delphiedintorni.it

 funzione Gen_Id(), però non può essere chiamata da una query
select gen_id(nomeGeneratore, 1) from RDB$DATABASE
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

il valoredi un generatore tramite una query.
Non era meglio porre il questito a database.Firebird?
deve essere una query?
altrimenti io faccio 
cdsAlunniID_ALUNNO.AsInteger:=SQLStoredProcAlunni.Params[0].Value;
M. Rossello



Grazie, funziona!
RDB$DATABASE non è visibile né tra le tabelle né tra i domini, cos'è
esattamente?


 esattamente?
Le RDB$* sono tabelle di sistema.  Ne esistono diverse.


 Le RDB$* sono tabelle di sistema.  Ne esistono diverse.
p.s.: nel caso specifico, considerale un po' come il DUAL di Oracle.


 Non era meglio porre il questito a database.Firebird?
Sveglia, stai scrivendo nella gerarchia it.*.


Sveglia
grazie, sempre amabile ;)
peace


 grazie, sempre amabile ;)
Prego, sempre troll.


 il parametro della stored
Scusa, ma creare una tabella dummy (tipo DUAL su Oracle) e fare una
query del tipo "SELECT GEN_ID(generatore, 1) FROM DUAL" ? Dopo tutto, tu
sai a priori quale generatore devi incrementare. Inoltre, in questo modo
ti risparmi di scrivere una procedura (nonche` ti ritrovi una tabella
fittizia su cui fare tutte le query su funzioni)
Enrico

query del tipo "SELECT GEN_ID(generatore, 1) FROM DUAL" ?
Non serve "creare una tabella dummy".
Come già detto in questo thread, basta fare:
SELECT GEN_ID(generatore, 1) FROM RDB$DATABASE

> SELECT GEN_ID(generatore, 1) FROM RDB$DATABASE
Sebbene possa risultare utile in un applicativo (in quanto non
risulterebbe possibile "eseguire" una espressione GEN_ID), non è
assolutamente necessario nel caso di una stored procedure; per
recuperare il valore successivo di un generatore basta scrivere:
      CREATE PROCEDURE ReadGen RETURNS (ret INTEGER) AS
      BEGIN
        ret = GEN_ID(MyGen, 1);
      END;
per l'assegnazione l'unico modo è quello di leggere il valore
corrente, tramite GEN_ID, ed utilizzarlo per la modifica. Ah tra
l'altro in multiutente due chiamate a GEN_ID non costituiscono
obbligatoriamente una operazione atomica !!! Ci ero cascato anch'io !
      CREATE PROCEDURE SetGen (val INTEGER) AS
      BEGIN
        val = GEN_ID (MyGen, val - GEN_ID (MyGen,0) );
      END
CREATE GENERATOR rientra fra i comandi DDL, quindi nella stored con
cavolo ! E qui vai con la TAB di sistema come diceva Andrea "inserzione
diretta" se non si è capito ;-)
      INSERT INTO RDB$GENERATORS (RDB$GENERATOR_NAME)
                          VALUES (UPPER('MYGEN'));
Il nuovo generatore è immediatamente disponibile, anche prima del
commit (però, come mi è capitato e non riuscivo a capire, in caso di
rollback, il nome del generatore ed il suo id verranno persi....). Non
bisogna dimenticare che gran parte delle versioni di IB hanno un bug
che impedisce la creazione di troppi generatori. (Così mi hanno detto
- verificare) !
Infine per eliminarlo, ovvio !
DROP GENERATOR <nome_generatore>;. 
Ciao il Troll ;-)

Sparisci troll.

 Sparisci troll.
Non sparisco su cazzate dette su FB. Il mio post è corretto il sistema
sopra che hai proposto è inutile. Sei molto bravo, ma anche i migliori
possono sbagliare.
Ciao ;-)

sopra che hai proposto è inutile.
Io stavo rispondendo a Enrico Bianchi, se non te ne sei reso conto.
Il post inutile è il tuo.

Si certo.

probabilmente la risposta del
Mer 27 Dic 2006
delle ore 18:10
non è la tua ma quella della tua amante che si è chiusa in bagno col
portatile ;-D
Non rispondero' oltre modo a questo post, diciamo che chi legge potrà
valutare da solo, soprattutto chi non chiama le Tabelle di sistema per
un generatore in una fottutissima SP...
Allora la prossima volta mi vado a confessare dal Papa!  Echheccazzo
....