Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-04-2004
Avatar de dchaparro
dchaparro dchaparro is offline
Registrado
 
Registrado: abr 2004
Ubicación: La Plata, Argentina
Posts: 9
Poder: 0
dchaparro Va por buen camino
Question Validar clave unica en Paradox

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!! 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.
Responder Con Cita
  #2  
Antiguo 15-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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:

Código:
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 15-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dchaparro
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
Responder Con Cita
  #4  
Antiguo 15-04-2004
Avatar de dchaparro
dchaparro dchaparro is offline
Registrado
 
Registrado: abr 2004
Ubicación: La Plata, Argentina
Posts: 9
Poder: 0
dchaparro Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 15-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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 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:

Código:
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
Responder Con Cita
  #6  
Antiguo 20-04-2004
Avatar de dchaparro
dchaparro dchaparro is offline
Registrado
 
Registrado: abr 2004
Ubicación: La Plata, Argentina
Posts: 9
Poder: 0
dchaparro Va por buen camino
Manejo del error Table.Post

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
Desde ya muchas gracias.
Responder Con Cita
  #7  
Antiguo 20-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dchaparro
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:16:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi