Yo utilizo este tipo de función para devolver el numero que debería tener la factura.
Lo pongo en el BeforePost del DataSet.
Código Delphi
[-]
procedure TDMFacturas.CabeceraBeforePost(DataSet: TDataSet);
begin
if (DataSet.State = dsInsert) then
begin
CabeceraNUMERO.AsInteger := DameContador;
end;
(...)
Código Delphi
[-]
function DameContador : integer;
var
Q : TIBQuery ;
T : TIBTransaction;
begin
Q := TIBQuery.Create(nil);
T := TIBTransaction.Create(nil);
T.DefaultDataBase := BaseDeDatos;
with Q do
begin
Close;
DataBase := BaseDeDatos;
Transaction := T;
if (not Transaction.InTransaction) then Transaction.StartTransaction;
SQL.Text := 'select gen_id(''CODIGO_VENTA'',1) as contador from rdb$database';
ExecQuery;
Result := Fields[0].AsInteger;
Transaction.Commit;
end;
Q.Free;
T.Free;
end;
Se supone que antes de hacer el post (donde se graba el registro)
- abre una transacción,
- pide un numero del generador y lo mete en el ID del Dataset
- cierra la transacción que abrió.
La transacción es creada en el momento y no tiene nada que ver con la transacción que utilizas para el resto de la aplicación.
Obviamente deberías modificar los triggers de BeforeInsert
Código SQL
[-]
create trigger venta_clave for venta active before insert position 0
as
begin
if ((new.numero = 0) or (new.numero is null)) then
new.numero = gen_id(codigo_venta,1);
end