Lo que yo suelo hacer para campos que de tipo entero que son correlativos, como es el caso del nº de factura, ejecuto en un query independiente la sentencia:
Código:
With Query do begin
SQL.Add(SELECT Max(Num_Factura) as Maximo From Facturas);
Open;
NumeroFactura := FieldByName('Maximo').AsInteger + 1;
Close;
End;
Donde NumeroFactura es el campo de la tabla facturas
Con ello te aseguras que siempre obtienes un nº de factura sin utilizar.