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 ¿ 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 |
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 |
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 |
O... conociendo la PK puedes preguntar si no existe algún registro con estos datos, esto evitaría que se produzca el error.
Saludos! |
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 |
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 |
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 ;-)
|
Key volation
Saludos
tengo un problemilla cuando se repiten las claves, Cita:
|
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. |
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 |
La franja horaria es GMT +2. Ahora son las 15:36:08. |
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