PDA

Ver la Versión Completa : Validar clave unica en Paradox


dchaparro
15-04-2004, 01:36:40
:) Hola. Los voy a molestar con algo basico. Tengo una tabla Paradox Empleados.db con un campo "Codigo" como clave unica (o sea con * en Key).
Cuando hago Empleados.Append, la tabla se pone en estado "dsInsert", luego ingreso los datos con DBEdits, y al presionar el boton Grabar, quiero validar si existe el Codigo ingresado. Si lo busco con FindKey, el cursor de la tabla se posiciona en otro registro y graba el que esta insertando antes de moverse!!:eek: Esto es lo que quiero evitar, por que si el codigo ya existia, me va a dar Error Key Violation.
Espero haber sido claro y desde ya muchas gracias.;)

jachguate
15-04-2004, 04:24:00
TE recomiendo mejor valerte del evento OnValidate del campo Codigo. Para averiguar si ya existe, no podes hacer una operación sobre el mismo componente TTable. Podes lanzar otro TQuery para verificar si existe: algo como:

query1.sql.text := 'Select * from empleados.db where codigo = :Codigo';
query1.ParamByName('Codigo').AsInteger := Table1Codigo.AsInteger;
query1.Open;
try
if not Query1.isEmpty Then
raise EDupValueError.CreateFmt('Error: el código %d ya existe!', [Table1Codigo.AsInteger]);
finally
query1.close;
end;


o bien tener otro TTable apuntando a empleados.db, refrescarla y hacer un findkey sobre esta.

Hasta luego.

;)

roman
15-04-2004, 04:49:02
al presionar el boton Grabar, quiero validar si existe el Codigo ingresado. Si lo busco con FindKey, [...] Esto es lo que quiero evitar, por que si el codigo ya existia, me va a dar Error Key Violation.


Sin embargo, tratar de validar tú mismo la duplicación de código es desaprovechar al motor de la base de datos. Normalmente él será más eficiente detectando la duplicación de registros que usando un método de búsqueda manualmente. A fin de cuentas de alguna manera tendrás que avisarle al usuario que está intentando insertar un registro que ya existe y la excepción que lanza el motor (Key Violation) se encarga de todo: avisa al usuario e impide la inserción. Si lo que deseas es mandar un mensaje personalizado puedes valerte del evento OnPostError de Table1 o bien englobar el Post en un bloque try-except.

// Saludos

dchaparro
15-04-2004, 05:30:04
Bueno, me sorprende la rapidez de las respuestas, creo que esta contestada la pregunta asi que voy a probar las soluciones enunciadas. Me inclinaría por el try-except (expuesto por Roman) para manejar errores, que nunca lo tuve en cuenta y debe ser muy util en muchas ocaciones.
Muchas gracias.

roman
15-04-2004, 06:33:27
Entonces te recomiendo una lectura del apartado de excepciones en la ayuda de Delphi para que tengas una idea más clara de cómo funcionan. Para el caso particular de excepciones del bde te recomiendo este mensaje (http://www.clubdelphi.com/foros/showpost.php?p=26295&postcount=6) del compañero marcoszorrilla en donde da un ejemplo muy claro del uso del evento OnPostError y que puedes aplicar a la técnica del try-except:


try
Table1.Post;
except
on E: EDBEngineError do
case E.Errors[0].ErrorCode of
eKeyViol: { maneja excepción 'Key Violation' }
eRequiredFieldMisssing: { Maneja excepción 'Required Field Missing }
...
etc
end;
end;


Según las circunstancias puede ser más recomendable utilizar el evento OnPostError ya que de esa manera centralizas el manejo de este tipo de excepciones de tal suerte que la excepción se manejará independientemente del lugar desde donde se hace el 'post'. El uso de try-except te obliga a colocar el manejo de la excepción en todos las partes de la aplicación en donde se haga un 'post' a la tabla en cuestión.

// Saludos

dchaparro
20-04-2004, 00:10:59
Voy a insistir con un punto mas en este tema. Hice try-except para manejar el error cuando hago Table.Post, donde le aviso ShowMessage('El codigo ya existe'); o algo asi y funciona de maravillas, pero cuando ejecuto dentro de Delphi, la ejecucion se interrumpe y me da el error ('Key violation' en este caso) y me dice 'Run o Step to continue' etc.. Me gustaria saber si esto es normal, o sea a pesar de que yo manejo el error, Delphi interrumpe la ejecucion igual.
Cabe aclarar que si ejecuto el programa fuera de Delphi, no hay ningun, problema no se interrumpe la ejecucion y queda mi reluciente mensaje en la pantalla :cool:
Desde ya muchas gracias.

roman
20-04-2004, 01:34:58
Me gustaria saber si esto es normal, o sea a pesar de que yo manejo el error, Delphi interrumpe la ejecucion igual.
Es perfectamente normal. Por defecto, al trazar una aplicación Delphi lanzará él mismo la excepción antes de que tu código la detecte a fin de que el trazado sea más fácil (pues al detenerse el editor se coloca automáticamente en la línea que genera la excepción).

Puedes deshabilitar este comportamiento en el menú Tools|Debugger Options|LanguageExceptions, deshabilitando la casilla "Stop on Delphi Exceptions"

// Saludos