Musisz skorzystać z generatora tabeli, który własnie takowy numer nadaje. Najlepiej zastosować procedurę na bazie, której parametrami wejściowymi będą dane dla inserta, a parametrem zwrotnym będzie jego unikalne ID.
Przykład
CREATE PROCEDURE GET_UNIQUE_ID(
DANA1 VARCHAR(20),
DANA2 VARCHAR(20),
DANA3 VARCHAR(20))
RETURNS(
ID INTEGER)
AS
BEGIN
ID = GEN_ID(NAZWA_KOLUMNY_KLUCZA, 1);
-- insert do tabeli
insert into tabela(id_klucz, pole1, pole2, pole3) values(:id, :dana1, :dana2, :dana3);
SUSPEND; -- Wyświetl ID
end
W tym przypadku do bazy zrobi się odpowiedni wpis a Ty w rezultacie otrzymasz jego ID, który później możesz wykorzystać robiąc np.
Dataset1.Locate('id', wartosc_z_procedury, []);
aby zaznaczyć nowo dodany rekord.
Na pewno żadnym rozwiązaniem nie będzie zapytanie:
select max(id) from tabela
ponieważ w przypadku większych baz danych i pracy wielu użytkowników na jednej bazie, może się to rozjechać i możesz otrzymać inny ID niż ten z Twojego inserta.
Z procedury korzystasz przez komponent IBStoredProc, lub dataset/ibsql i wywołujesz (tylko dla Dataset lub IBSQL)
select id from get_unique_id(':dana1, :dana2, :dana3');
Dataset.Parambyname('dana1').AsString := ...
itd...
Natomiast do pola z ID zwrotnym komponentu IBStoredProc odwołujesz się przez:
IBStoredProc.FieldByName('id').AsInteger
zamiana znacznika <code class="delphi"> na <code class="sql"> - furious programming