Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-12-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.710
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
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:
Código SQL [-]
create table tbUsuarios
  codigo integer not null,
  nombre varchar(64),
  primary key (codigo)
);
Usuario predeterminado:
Código SQL [-]
insert into tbusuarios values (0,'admin');
Creas la excepción por si intentan borrarlo, junto al texto que se mostrará:
Código SQL [-]
create exception EXCP_NO_BORRAR 'No está permitido borrar este registro';
Creas el trigger donde se controlará que no se borre el usuario admin:
Código SQL [-]
CREATE OR ALTER trigger tbusuarios_bd0 for tbusuarios
active before delete position 0
AS
begin
  if (old.codigo=0) then  /* si intentan borrar el usuario admin, se mostrará el mensaje */
    exception excp_no_borrar;
end ^
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í:
Código Delphi [-]
try
  ...
  qry.Post;
except
  on E:exception do
    ShowMessage(E.ClassName +' '+ E.Message);
end;
Bueno, lo he escrito todo de memoria, pero te sirve de referencia.
Responder Con Cita
  #2  
Antiguo 24-12-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 24-12-2015
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 252
Poder: 24
Osorio Va por buen camino
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.
Código SQL [-]
CREATE TRIGGER CONEXION_NEW FOR CONEXION
ACTIVE BEFORE INSERT
POSITION 1
AS
BEGIN

  NEW.Id_Conexion = GEN_ID(ID_Conexion, 1);



  IF new.id_conexion = 350 THEN --cambia la condicion de acuerdo a tu necesidad. tal vez necesites hacer una consulta a una tabla para validar que el usuario este conectado o no.
  BEGIN
          EXCEPTION USUARIO_CONECTADO;
  END
END
Responder Con Cita
  #4  
Antiguo 24-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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ódigo SQL [-]
CREATE EXCEPTION E_SIN_NOMBRE '~El campo NOMBRE es un dato requerido.';

C++ Builder:
Código PHP:
...
{
  if (
E->ClassNameIs("EIBInterBaseError")) {
    
EIBInterBaseError *EI = static_cast <EIBInterBaseError*> (E);
    
int p1 = EI->Message.Pos("~");
    
int p2 = EI->Message.Pos(".");
    
AnsiString msg = p1 ? EI->Message.SubString(p1 + 1, p2 - p1) : EI->Message;
    
MessageBox(0, msg.c_str(), "", MB_ICONERROR);
  } else
    
MessageBox(0, E->Message.c_str(),"", MB_ICONERROR);
} 
De ese modo el mensaje, que sin tratar, debería verse así:


Se verá así:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 28-12-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
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:
violation of PRIMARY or UNIQUE KEY constraint \"UQ_CONEXION\" on table \"CONEXION\"\r\nProblematic key value is (\"NOMBRE\" = 'FEDERICO')
y por ninguna parte aparece el que está definido en la excepción:
Código:
CREATE EXCEPTION USUARIO_CONECTADO '~Este usuario está activo en otro terminal~'
A pesar de estar definido en el trigger:
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
Lo que no me creo es que no haya ninguna forma de mostrar esos mensajes definidos por el usuario
Responder Con Cita
  #6  
Antiguo 28-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Angel.Matilla Ver Mensaje
....
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:
y por ninguna parte aparece el que está definido en la excepción:
Código:
CREATE EXCEPTION USUARIO_CONECTADO '~Este usuario está activo en otro terminal~'
...
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
__________________
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
Responder Con Cita
  #7  
Antiguo 28-12-2015
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 252
Poder: 24
Osorio Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 28-12-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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 Ver Mensaje
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 11:47:19.


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
Copyright 1996-2007 Club Delphi