PDA

Visualizza la versione completa : [delphi] valore ID_GENERATOR


123delphi321
17-04-2004, 12:40
ciao a tutti,

ho una IBtabellaMovimenti con un campo ID_MOVIMENTI, a questa e' collegato un TRIGGER che agisce sull'evento Before Insert al fine di generare un progressivo univoco:

CREATE TRIGGER MOVIMENTI_BI0 FOR MOVIMENTI
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.id_movimenti = GEN_ID(prog_movimenti , 1);
end

quindi, questo evento si verifica non appena si inserisce un nuovo record.

il mio problema e' quello di ottenere il valore progressivo generato.

in pratica nel momento che io eseguo Ibtable.applyupdates viene generato questo numero....che non riesco a catturare.

ho provato a leggere il field id_movimenti subito dopo...

IBTable1.ApplyUpdates ;
Edit1.Text:= IBTable1.fieldbyname('id_movimenti').AsString ;


ma non riesco a vedere il numero generato...


mi sapete aiutare?

grazie

alka
17-04-2004, 12:58
Il problema dovuto al fatto che Delphi tenta di ottenere il record aggiornato attraverso una query di selezione eseguita verso il database server. Per selezionare il record, viene utilizzato il valore della chiave primaria (campo ID?), solo che il valore di tale campo viene determinato lato server al momento dell'inserimento, pertanto la ricerca non va a buon fine e, in sostanza, non possibile completare l'aggiornamento e nel peggiore dei casi si manifesta un errore.

La soluzione "ammazza problema" quella di utilizzare s il generatore, ma di ottenere il suo valore dall'applicazione Delphi e assegnarlo al record prima di effettuare l'inserimento (se il campo autoincrementale ancora NULL e pertanto non assegnato).

In una discussione precedente (http://forum.html.it/forum/showthread.php?s=&threadid=634802) ti avevo gi segnalato un link da leggere con la trattazione di questo problema (in parte).

Si tratta di acquisire il generatore da Delphi e assegnarlo al record (in questo modo, se il record viene accettato, l'applicazione possiede gi l'ID numerico per poter rinfrescare i propri dati).

Il trigger che hai creato va benissimo, ma andrebbe complementato con un confronto che impedisca l'assegnazione del generatore quando esso gi determinato. Un esempio (non testato, da adattare):


CREATE TRIGGER nometrigger FOR nometabella
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (new.id is null) then
begin
new.id = gen_id(nomegeneratore, 1);
end;
end

Per maggiori dettagli, soprattutto sull'acquisizione del generatore in Delphi, leggi la discussione che ti ho linkato.

Ciao! :ciauz:

Loading