Si quieres números consecuentivos entonces descartamos un generador.
No mantengo contadores porque me parecen innecesarios y una fuente potencial de problemas.
Para esos casos yo compruebo el ultimo número dado de alta y le sumo uno.
Si alguien ha dado de alta ese número mientras tanto, pues vuelvo a pedir de nuevo el último y le sumo 1, y así varias veces.
Si transcurridos varios intentos están siempre ocupados los números que voy pidiendo es que algo anormal ha ocurrido y ya saco el mensaje de error.
He modificado un trozo de código, simplificándolo, a ver si no me he equivocado, pero al menos sirve para que se entienda lo que hago.
Uutiles.pas (datos de configuración del programa)
Código Delphi
[-]
const
_INTENTOS_GRABAR_ = 5;
Cualquier otra Unit.pas
-------------------------------------------------
Código Delphi
[-]procedure TForm1.btGrabarClick(Sender: TObject);
var
iIntentos : Integer;
begin
iIntentos := 0;
DS.DataSet.FieldByName('codigo').AsInteger := getNuevoCodigo( tabla, campo ); try
DS.DataSet.Post;
except
try
while iIntentos < _INTENTOS_GRABAR_ do
begin
try
DS.DataSet.Post;
Break;
except
DS.DataSet.FieldByName('codigo').AsInteger := getNuevoCodigo( tabla, campo );
end;
inc(iIntentos);
end;
except
on E:exception do
Error(-100, Format('(%s) Error: %s', [E.ClassName, E.Message]));
end;
end;
end;