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 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):
Per maggiori dettagli, soprattutto sull'acquisizione del generatore in Delphi, leggi la discussione che ti ho linkato.codice: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
Ciao!![]()