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)
-   -   problema con TRIGGER (https://www.clubdelphi.com/foros/showthread.php?t=35538)

Manuel 13-09-2006 16:55:55

problema con TRIGGER
 
hola amigos del foro, estoy peleando con los TRIGGER y crear este me dice que no existe, quiero autoincrementar el campo nro de la tabla ticks, pero al grabarla me dice TRIGGER no found. no entiendo?, aqui el código.

Código SQL [-]
CREATE TRIGGER GEN_TICKS FOR TICKS AFTER INSERT POSITION 0 AS
BEGIN
  NEW.NRO = GEN_ID(GENTICKS ,1);
END

Manuel 13-09-2006 17:47:05

Cita:

Empezado por Manuel
hola amigos del foro, estoy peleando con los TRIGGER y crear este me dice que no existe, quiero autoincrementar el campo nro de la tabla ticks, pero al grabarla me dice TRIGGER no found. no entiendo?, aqui el código.

Código SQL [-]
CREATE TRIGGER GEN_TICKS FOR TICKS AFTER INSERT POSITION 0 AS
BEGIN
  NEW.NRO = GEN_ID(GENTICKS ,1);
END

Me respondo, lo que me faltaba era crear el generador "GENTICKS ", pero ya esta solucionado, pero ahora, apelkando a mi lógica, al insertar un registro en la tabla ticks automaticamente con esto el campo nro se autoincrementará lo probé pero nada, que será faltará algo.

jacanche 13-09-2006 18:01:38

Le falta que le cambies el evento a "BEFORE", como lo tienes el triger se dispara despues que se realiza la insercion.

jachguate 13-09-2006 18:02:38

Los triggers after, como su nombre lo indica, se disparan después de la inserción física del registro, por lo que no tiene sentido alterar algún dato, pues esto ya no se reflejará en el registro.

Comento que una de las mejoras de firebird 2 es que al intentar compilar un trigger como este, obtendrás un error o un warning, no recuerdo con exactitud ahora, que te indicará que el registro new es de solo lectura.

Para lo que vos queres, precisas de crear un trigger que se ejecute antes de la inserción.

Hasta luego.

;)

Manuel 13-09-2006 18:25:07

gracias amigos, ya había cambiado eso after por before pero igual, resulta que el campo nro es la llave principal de mi tabla algo leí en foro que había problema con eso será por eso que no me autoincrementa?, de todas maneras elomine el indice pero igual.

jachguate 13-09-2006 19:14:08

Puedo asegurarte que si el trigger está before, ¡Se auto-incrementa, como vos decis!

¿desde donde lo estas viendo?

Manuel 13-09-2006 21:56:40

Cita:

Empezado por jachguate
Puedo asegurarte que si el trigger está before, ¡Se auto-incrementa, como vos decis!

¿desde donde lo estas viendo?


Este es mi TRIGGER:

Código SQL [-]
CREATE TRIGGER TICKSTRIGGER1 FOR TICKS BEFORE INSERT POSITION 0 AS
BEGIN
 NEW.NRO = GEN_ID(GEN_NRO ,1);
END

Mi generador:

Código SQL [-]
CREATE GENERATOR GEN_NRO;
SET GENERATOR GEN_NRO TO 3

Ahora el campo nro (el cual supuestamente se autoincrementa), es mi llave de la tabla por lo tanto no acepta valores null, y cuando agrego un registro por ejemplo en SQL Explorer, me da el siguiente error. 'Field NRO must have value', por lo tanto no me esta llenado el TRIGGER el campo nro.

jacanche 13-09-2006 22:19:56

eso pasa, por que el sql explorer hace un verificacion de los campos que requieren valor antes de generar la instruccion de insercion, si quieres meter valores puedes ponerle un valor cualquiera, por ejemplo cero, cuando se realice la insercion tu campo tendra el valor correcto, ahora bien tambien puedes insertar los registros por medio de una sentencia
Código SQL [-]
insert into
en la cual omitas el campo nro.


La franja horaria es GMT +2. Ahora son las 12:30:57.

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