Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Gestionar excepciones en un trigger (https://www.clubdelphi.com/foros/showthread.php?t=89598)

Osorio 28-12-2015 15:54:40

Efectivamente no hay congruencia por que estas en en evento BEFORE osea que en este punto los datos no han sido insertados en la tabla por lo tanto no se ha producido ninguna excepcion por lo tanto

Código SQL [-]
WHEN GDSCODE unique_key_violation DO BEGIN
    EXCEPTION USUARIO_CONECTADO;
  END

Nunca entra por que hasta este punto no ha ocurrido ninguna excepcion.


Resulta que cuando se intentan escribir los datos sobre la tabla (despues de haber pasado por este triggger) es cuando realmente se produce la excepcion y por eso el mensaje que se lanza es el nativo de FB no el personalizado.

Te sugiero que revises el mensaje anterior que te escribi. Para que valides en el trigger (antes de... ) y desde alli dispares la excepcion personalizada.

Saludos.

Angel.Matilla 28-12-2015 17:51:32

Cita:

Empezado por ecfisa (Mensaje 500834)
Pero... si usas el mismo caracter para señalizar el inicio y el final del mensaje, nunca lo va a mostrar !, revisa nuevamente el código C++.

Saludos :)

Sí hombre, sí. Es tan fácil como cambiar el código que me has sugerido por este:
Código:

int p1 = EI->Message.Pos("~");
int p2 = EI->Message.LasteDelimiter("~");

Es que,a demás, como decía antes aun poniendo ese carácter "fantasma" tal cual estaba escrito el trigger sólo me saca el mensaje por defecto de Firebird. He encontrado otra manera; no sé si será la mejor o no, pero me funciona.
1. He definido la excepción como he comentado antes, incluyendo ese carácter ~ al principio y al final del mensaje.
2. He redefinido el trigger así:
Código:

CREATE TRIGGER CONEXION_NEW FOR Conexion
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.Nombre IN (SELECT Nombre FROM Conexion)) THEN
    EXCEPTION USUARIO_CONECTADO;
 
  NEW.Id_Conexion = GEN_ID(ID_Conexion, 1);
END

Dado que ese campo Nombre es clave única para la tabla, tan fácil como mirar si ya existe en la tabla. Escrito así el mensaje que me devuelve FB es este:
Cita:

exception 16\r\nUSUARIO_CONECTADO\r\n~Usuario activo en otro terminal~\r\nAt trigger 'CONEXION_NEW' line: 2, col: 52
Y bsucando el trozo que interesa se queda sólo el mensaje que yo genero. También puedo eliminar el último ~ y sacar más información.
Cita:

Empezado por Osorio (Mensaje 500835)
Efectivamente no hay congruencia por que estas en en evento BEFORE osea que en este punto los datos no han sido insertados en la tabla por lo tanto no se ha producido ninguna excepcion por lo tanto

¿Ves? De ese matiz no me había dado cuenta.:(


La franja horaria es GMT +2. Ahora son las 08:13:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi