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)
-   -   sqlcode (https://www.clubdelphi.com/foros/showthread.php?t=26529)

Juanito-Kun 25-10-2005 23:14:29

sqlcode
 
hola que tal, estoy trabajando con Delphi 7 y Firebird 1.5..
bueno tengo el siguiente detalle..

tengo un trigger que quiero que me verifica si la llave esta duplicada si lo esta que me arroje un mensaje..

Código:

CREATE TRIGGER "tgrVerDatArea" FOR TBLCATARE ACTIVE
BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN
       
 when sqlcode  -803 do
          exception "VilArea";

END

VilArea es un excepcion que me tira un mensaje... lo malo es que no lo hace el trigger :eek: .. me sigue saliendo el mensaje de error por default..

que estoy haciendo mal?..

sanxpue 25-10-2005 23:56:09

Pues
 
Los trigger no regresan nada esa es la diferencia a un Stored Procedure, osease que lo que quieres hacer lo vas a hacer con un Stored Procedure

jachguate 26-10-2005 03:41:54

El trigger before insert no puede "cachar" un error que no se ha producido cuando se invoca (el SQL code ocurrirá un instante después, cuando se intente aplicar el registro a la bd). El trigger after tampoco servirá, pues dado que el error ya ocurrió, nunca llega a dispararse.

En general, no podes capturar en el trigger un error que se generará por la inserción del registro en la bd.

Podrias hacer un select sobre la misma tabla verificando si ya existe un valor con la misma clave para elevar tu propia excepción, pero esto solo añadirá carga al servidor, a mi juicio, innecesaria.

¿Por que no capturas el error desde donde está intentando insertarse el registro?

Saludos.

Juanito-Kun 26-10-2005 06:39:54

trigger sqlcode
 
hola que tal he leido las respuestas que me mandan..

tengo el siguiente trigger:

Código:

CREATE TRIGGER "tgrVerDatArea" FOR TBLCATARE ACTIVE
BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN

 if (new.cvecatare is null) then
        exception "CveArea";

 if (new.descatare is null) then
        exception "NomArea";

when sqlcode  -803 do
          exception "VilArea";END

las dos primeras verifican si dos columas esta con nulas si estan nulas aparecen las excepciones.. eso si me lo hace.. pero el sqlcode no me lo ejecuta y creo que jachguate tiene razon...

pero entonces para que esta el sqlcode? :confused: ... en que casos de usa o como:confused: se usa..

saludos y gracias por responder...

jachguate 26-10-2005 06:55:13

Te serviría en un caso como:

Código SQL [-]
CREATE TRIGGER "tgrVerDatArea" FOR TBLCATARE ACTIVE
BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN

 if (new.cvecatare is null) then
   exception "CveArea";

 if (new.descatare is null) then
   exception "NomArea";

insert into otratabla (otrosvalores)

when sqlcode  -803 do
    exception "CodigoDuplicadoEnOtraTabla";
END

Hasta luego.

;)

Juanito-Kun 26-10-2005 16:00:51

sqlcode trigger
 
Ok..

Gracias jachguate, sanxpue son muy amables..

saludos y que esten bien..;)

Morphine 05-04-2006 21:30:04

Al final pudiste mostrar el mensaje de excepcion?, como lo hiciste, probe de la forma que dice en el ejemplo y funciona de todo menos la linea:
Código:

begin
....
....
when sqlcode -803 do
    exception nombreexcepcion
end
^

no se si es por el momento en que ejecuta el trigger (BEFORE INSERT) o estoy preguntando por un sqlcode que es incorrecto (-803), lo que quiero es evitar la duplicidad de clave primaria en una tabla con clave combinada.

PepeLolo 06-04-2006 12:46:31

Buenas a to er mundo.

a) un trigger before, la palabrita "before", lo dice claramente en englies pitinglis, antes de..., por lo que es imposible que devuelva una excepción por duplicidad de clave, ya que aun no se ha producido la actualización del registro en la tabla.

b) con el after, sucede lo mismo. Se ejecuta despues de actualizar el registro en la tabla.

Posibles controles a realizar:
a) En el trigger, realizar una búsqueda del registro y generar la excepción si se duplica.

b) Que sea la BD quien controle la duplicidad y controlar el error en la aplicación.

Personalmente me decanto por el segundo caso "b)". :cool:


La franja horaria es GMT +2. Ahora son las 05:34:11.

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