Ver Mensaje Individual
  #13  
Antiguo 19-10-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Reputación: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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 );  // esto sólo hace un select max(campo)+1 from tabla
  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;
Responder Con Cita