FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Gestionar excepciones en un trigger
Como ya he comentado estoy tratando de enterarme como funcionan los triggers. Muchas cosas las entiendo a la perfección pero hay algo que se me escapa totalmente: ¿Cómo gestionar las excepciones? Seguro que en el foro ya hay algo pero no he sido capaz de encontrarlo.
Tengo definido este trigger: y la excepción está definida así: para esta tabla: Tengo un módulo de gestión de errores (el código está simplificado): Código PHP:
Última edición por Casimiro Notevi fecha: 22-12-2015 a las 14:03:27. |
#2
|
||||
|
||||
Hola,
¿Has probado con el método "getMessage" de la excepción, o sea E->getMessage()? |
#3
|
||||
|
||||
He probado con E->getMessage() y con ErrorIB->getMessage(), y en ambos casos me indica el compilador que no existe el método. Siento ser tan paliza, pero es que por más que he buscado documentación no he visto cómo usar esas excepciones definidas; no lo entiendo.
Última edición por Angel.Matilla fecha: 22-12-2015 a las 17:41:49. |
#4
|
||||
|
||||
A ver. El único mensaje al que puedo acceder es E->Message y su valor es, en este caso:
Cita:
|
#5
|
||||
|
||||
Hola Angel.Matilla
Cita:
Código PHP:
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#6
|
||||
|
||||
Hola,
Bueno, yo tengo que decir que metí la pata... puesto que creí que tratábamos de PHP y no de C++... por eso no existe el método "getMessage" en el objeto/excepción, pero dicho método existe en PHP. Siento haberte hecho perder el tiempo. Prueba la solución del compañero Daniel a ver si hay suerte. |
#7
|
||||
|
||||
Cita:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#8
|
||||
|
||||
Pues es verdad que se usan las mismas etiquetas... aunque yo ni me fijé en ese detalle. El código me pareció PHP tal cual, vamos.
|
#9
|
||||
|
||||
¡Hombre! Me parece bastante evidente: Si defino un mensaje para uan excepción lo lógico es emplearlo y mostrar al usuario la información lo más precisa posible. A un usuario de una aplicación, que no tiene por qué saber de programación, el mensaje genérico «violation of PRIMARY or UNIQUE KEY constraint \"UQ_CONEXION\" on table \"CONEXION\"\r Problematic key value is (\"NOMBRE\" = 'FEDERICO'» no le dice nada, pero si le informo que «'Este usuario está activo en otro terminal'» se preocupará de buscar la razón.
|
#10
|
||||
|
||||
Hola,
Trata de averiguar si cuando hacemos esto: Código:
CREATE EXCEPTION USUARIO_CONECTADO 'Este usuario está activo en otro terminal' |
#11
|
||||
|
||||
Cita:
No hay que hacer nada más. |
#12
|
||||
|
||||
Cita:
Así yo entiendo que he creado una excepción y su mensjae asociado. En otro hilo de este mismo subforo encontré una respuesta; es para Delphi y en principio debería ser fácil de adaptar a Builder. Pero me dejó perplejo parte del código que hay: Código:
uses IB; ... try ... insertquery.ExecSQL; except on E:Exception do case EIBInterBaseError(E).IBErrorCode of $14000019: ShowMessage('Deadlock'); $14000888:// se produjo la excepcion ERR_NO_TITULO ShowMessage('El título no puede estar vacio'); end; En otros hilos he visto que hay la posibilidad de modificar los mensajes genéricos de FB, pero entonces no sé para que valen esos mensajes de excepción que se puede definir en la base de datos. |
#13
|
||||
|
||||
Hola.
Te aseguro que no lo era tanto para mí... Es decir que queres traducir los mensajes de error, a otra forma que consideras que tus usuarios entenderán mejor. Bueno, para eso no veo otra opción que hacerlo manualmente evaluando todos los GDSCODE, me refiero a algo similar a este ejemplo: Código PHP:
Cita:
Código:
SQLCODE | GDSCODE | SYMBOL TEXT --------+-----------+---------------+------------------------------------- -901 | 335544345 | lock_conflict | Lock conflict on no wait transaction Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 24-12-2015 a las 03:13:21. Razón: sintáxis |
#14
|
||||
|
||||
Queda demostardo que cada uno ve las cosas de diferente manera
Cita:
Cita:
Muchas gracias por las sugerencias. Última edición por Angel.Matilla fecha: 24-12-2015 a las 09:53:07. |
#15
|
||||
|
||||
Si lo que quieres es mostrar mensajes simples a los usuarios, puedes hacer algo así, ejemplo:
Tienes una tabla de usuarios que contiene un usuario predeterminado que no se debe borrar: Usuario predeterminado: Creas la excepción por si intentan borrarlo, junto al texto que se mostrará: Creas el trigger donde se controlará que no se borre el usuario admin: Y eso es todo. Otra cosa diferente es mostrar los mensajes tal y como se generan por la base de datos, puedes hacer algo así: Bueno, lo he escrito todo de memoria, pero te sirve de referencia. |
#16
|
||||
|
||||
Gracias por la respuesta Casimiro. En el trigger que yo he puesto lo que trato de impedir es que se den de alta dos registros para el mismo valor de Nombre. Tal como lo tengo creado al producirse unique_key_violation el mensaje que se muestra es el propio de Firebird y no el que está declarado en la excepción; no veo como "sacar" el valor de la excepción. Ese el problema que tengo.
|
#17
|
||||
|
||||
Aqui no tengo firebird para probar pero asi por encima creo que la cosa va por aqui.
Si quieres tener una excepcion personalizada, debes hacer la validacion personalizada.
|
#18
|
||||
|
||||
La otra opción que se me ocurre para lo que buscas hacer, requiere que todos los mensajes de error incluyan dos caracteres arbitrarios que circunscriban al mensaje señalizándolo (para el ejemplo elegí "~" y ".").
Firebird:
C++ Builder: Código PHP:
Se verá así: Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#19
|
||||
|
||||
La idea de exfisa de insertar algún carácter raro no parecía mala, pero no vale. He puesto ese carácter ~ en el mensaje de la excepción, pero al producirse el error el mensaje que me devuelve es el genérico de FB:
Cita:
Código:
CREATE EXCEPTION USUARIO_CONECTADO '~Este usuario está activo en otro terminal~' Código:
CREATE TRIGGER CONEXION_NEW FOR CONEXION ACTIVE BEFORE INSERT POSITION 1 AS BEGIN NEW.Id_Conexion = GEN_ID(ID_Conexion, 1); WHEN GDSCODE unique_key_violation DO BEGIN EXCEPTION USUARIO_CONECTADO; END END |
#20
|
||||
|
||||
Cita:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 28-12-2015 a las 15:50:49. Razón: corrección |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Duda Sobre Excepciones - Propagar Excepciones entre los formularios | Neeruu | Varios | 2 | 26-02-2010 20:36:50 |
Gestionar contraseñas ?????????? | david_uh | Varios | 11 | 04-01-2008 18:46:17 |
Como gestionar un proyecto | Aprendiendo | Varios | 1 | 30-06-2007 00:28:14 |
Gestionar excepciones | Angel.Matilla | C++ Builder | 0 | 29-01-2007 13:41:54 |
Gestionar Base de Datos | tarco35 | Conexión con bases de datos | 1 | 22-11-2003 15:55:33 |
|