Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-01-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Evitar un Key Violation

Buenas, Estoy retocando una aplicación y quisiera verificar ANTES DE QUE OCURRA la validez de una clave, me explico:

Visitando los foros encontré que una de las maneras de manejar la excepción del Key Violation era:

Código:
Try
    db.Post;
Except
   Mensaje....
End;
Ahora bien, manejarlas de esa manera me obligaría a crear un bloque Try..Excep en cada post de la aplicación. Preferiría usar los eventos de la base de datos OnPostError o mejor OnBeforePost para validar la clave antes de que se genere la excepción. Tengo la dificultad adicional de que parte de la base de datos está filtrada y hay claves ocultas.

¿ Existe alguna función como Function IsValidKey(Registro o clave):Boolean (o algo así) que permita llamar a la BDE para que se verifique la validez de la clave ?

El código debe ser algo así:

Código:
Evento On BeforePost

If Not(IsValidKey(Registro acual)) Then
   Begin
   // Mensaje de clave duplicada
   Abort; // pero debe seguir el insert o edit 
   End;
__________________
Sitrico

Última edición por sitrico fecha: 14-01-2004 a las 15:08:02.
Responder Con Cita
  #2  
Antiguo 14-01-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Existir, no existe, que yo sepa, lo que puedes hacer es en BeforePost lanzar una query sobre la tabla y en el where poner la clave y mirar si devuelve o no registros

o bien utilizar el evento OnPostError y mirar el código de error que devuelve para saber si es debido a un key violation
Responder Con Cita
  #3  
Antiguo 14-01-2004
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
No se si te entendi mal, pero lo que tu pides es algo tan facil como crear una funcion donde haces el bloque try ... except para la tabla que le pases por parametro, y al momento de grabar no llamas al post sino a la funcion que te devolvera true si se ejecuto o false si fallo, en el except debes capturar el error en un objeto EDBEngineError

te doy un ejemplo

function Mi Grabado(MiTabla: TTable): Boolean
begin
try
T.Post;
except
on E: EDBEngineError do
begin
ErrorCode := E.Errors[0].ErrorCode;
case ErrorCode of
//distintos casos de error(busca la ayuda)
end
end
end


al llamarla funcionara algo asi
if MiGrabado(Tabla) then


Me parece la solucion mas facil
Responder Con Cita
  #4  
Antiguo 14-01-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
O... conociendo la PK puedes preguntar si no existe algún registro con estos datos, esto evitaría que se produzca el error.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 14-01-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

Me gustaría agregar, respecto de la pregunta original, que en mi opinión los errores de violación de acceso no deben tratarse mediante bloques try-except. Son errores graves que puden dejar inestable a la aplicación o a la pc y es mejor revisar qué los causa y retocar el código para que no sea así (verificar que los punteros u objetos no sean nil, que no referenciemos índices de arreglos inválidos, etc,)


Por favor olviden esto. Me confundí entre "Access Violation" y "Key Violation"

// Saludos

Última edición por roman fecha: 14-01-2004 a las 17:04:31. Razón: Leí mal la pregunta
Responder Con Cita
  #6  
Antiguo 14-01-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Aquí tienes los códigos más interesantes de error y un ejemplo de como manipular el "KeyViol", yo lo que hago es definir un Procedimiento y le llamo desde cualquier postError de cualquier tabla para evitar la repetición del mismo código.
Código:
 const
   eKeyViol = 9729;
   eRequiredFieldMissing = 9732;
   eForeignKey = 9733;
   eDetailsExist = 9734;
   eSqlGralerror = 13059;
 implementation
 
 {$R *.DFM}
 
 procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
   var Action: TDataAction);
 begin
   if (E is EDBEngineError) then
     if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
     begin
     Application.MessageBox('Imposible dar alta ese registro ya existe','Atención',mb_Ok +
     mb_IconQuestion);
     Abort;
   end;
 end;
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #7  
Antiguo 16-01-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Gracias a todos, opté por la solución de marcoszorrilla porque validar usando un query antes de cada post no debe ser muy bueno para el rendimiento ;-)
__________________
Sitrico
Responder Con Cita
  #8  
Antiguo 16-03-2005
lroblesco lroblesco is offline
Miembro
 
Registrado: ene 2005
Ubicación: Baja California Sur, Mexico
Posts: 77
Poder: 20
lroblesco Va por buen camino
Key volation

Saludos
tengo un problemilla cuando se repiten las claves,
Cita:
Empezado por marcoszorrilla
Aquí tienes los códigos más interesantes de error y un ejemplo de como manipular el "KeyViol", yo lo que hago es definir un Procedimiento y le llamo desde cualquier postError de cualquier tabla para evitar la repetición del mismo código.
Código:
   const
     eKeyViol = 9729;
     eRequiredFieldMissing = 9732;
     eForeignKey = 9733;
     eDetailsExist = 9734;
     eSqlGralerror = 13059;
   implementation
   
   {$R *.DFM}
   
   procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
     var Action: TDataAction);
   begin
     if (E is EDBEngineError) then
       if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
       begin
       Application.MessageBox('Imposible dar alta ese registro ya existe','Atención',mb_Ok +
       mb_IconQuestion);
       Abort;
     end;
   end;
Un Saludo.
Saben pongo el codigo como este, y me salta la excepcion, y en el debugger option escojo que no se detenga en las excepciones. Me sale un error mas o menos asi "Los cambios solicitados en la tabla.......' que puedo hecer? manejo una BD Access 2000 gracias
__________________
No siempre el mas veloz es el que gana la carrera
Responder Con Cita
  #9  
Antiguo 16-03-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Aclarar que la rutina que yo facilité en su día es para el BDE, Paradox fundamentalmente, por lo cual no servirá para Access.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #10  
Antiguo 01-06-2005
Ing Harry Ing Harry is offline
Miembro
 
Registrado: jun 2005
Posts: 12
Poder: 0
Ing Harry Va por buen camino
Cool Algo Similar

Saludos

Tengo Un Problema Al Validar Llaves Primarias. Resulta Que Yo Hice Una Aplicacion Que Se Alimenta A Partir De Archivos Planos. Yo Valido Usando Una Consulta Que Toma Cada Linea Y La Consulta En La Tabla, En Caso De Que Su Llave Este Duplicada, El Sistema La Actualiza Con Los Demas Campos, En Caso Contrario Crea Un Nuevo Registros Con Estos Datos. El Problema Es Que Al Cargar Un Archivo Con Muchos Registros El Sistema Se Me Pone Lento. Estoy Convencido Que El Problema Radica En La Forma De Validar. Que Me Recomiendan Ustedes Hacer Para Mejorar El Rendimiento.

Agradezco La Atencion.

Atentamente
Ing Harry :d :d :d
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 08:56:55.


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