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