En firebird existen los generadores.
Los generadores siempre devuelven números diferentes (
garantizado por la base de datos).
Los generadores siempre se incrementan, a pesar de que la transacción falle (Rollback).
Yo suelo dejar que la base de datos lo genere y me lo devuelva.
Con esta sentencia y el generador en el trigger:
Código SQL
[-]
CREATE TRIGGER CABECERA_BI0 ...
AS
BEGIN
new.id = GEN_ID(CONTADOR_CABECERA, 1);
...
END
INSERT INTO CABECERA (CLIENTE, FECHA, ...)
VALUES (:CLIENTE, :FECHA, ...)
RETURNING ID
Cuando por alguna razón no puedo utilizarlo de esta manera, pido un número al generador y luego lo utilizo en el insert
Código Delphi
[-]
function TDMMain.ContadorGen(NomGen: string): integer;
begin
Result := 0;
if (Trim(NomGen) > '') then
begin
with THYFIBQuery.Create(nil) do
begin
try
Close;
DataBase := Self.DataBase;
SQL.Text := 'SELECT GEN_ID(' + NomGen + ', 1) FROM RDB$DATABASE';
ExecQuery;
Result := Fields[0].AsInteger;
Close;
FreeHandle;
finally
Free;
end;
end;
end;
end;
INSERT INTO CABECERA (ID, CLIENTE, FECHA, ...)
VALUES (:ID, :CLIENTE, :FECHA, ...)