FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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; ¿ 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. |
#2
|
|||
|
|||
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 |
#3
|
||||
|
||||
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 |
#4
|
||||
|
||||
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. |
#5
|
||||
|
||||
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 |
#6
|
||||
|
||||
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;
__________________
Guía de Estilo de los Foros Cita:
|
#7
|
||||
|
||||
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 |
#8
|
|||
|
|||
Key volation
Saludos
tengo un problemilla cuando se repiten las claves, Cita:
__________________
No siempre el mas veloz es el que gana la carrera |
#9
|
||||
|
||||
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:
|
#10
|
|||
|
|||
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 |
|
|
|