Ver Mensaje Individual
  #5  
Antiguo 28-05-2024
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.757
Reputación: 21
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;


// Luego inserto llamando al procedimiento para el valor del parámetro ID
INSERT INTO CABECERA (ID, CLIENTE, FECHA, ...)
VALUES (:ID, :CLIENTE, :FECHA, ...)
Responder Con Cita