Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Trigger en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=75819)

Antoniov 21-09-2011 00:36:24

Trigger en Firebird
 
Tengo un Trigger en el evento Before Insert que funciona perfectamente.

Código SQL [-]
SET TERM ^ ;

CREATE TRIGGER BI_DOCUMENTOS_CODDOCUMENTO FOR DOCUMENTOS
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.CODDOCUMENTO IS NULL) THEN
      NEW.CODDOCUMENTO = GEN_ID(DOCUMENTOS_CODDOCUMENTO_GEN, 1);
END^

SET TERM ; ^

Pero cuando intento poner otro Trigger en otros eventos como After Insert, me da un mensaje de error el el nombre del campo. Incluso copiando el anterior me da error

Código SQL [-]
ALTER TRIGGER DOCUMENTOS_AI_NUM_DOCS
ACTIVE AFTER INSERT
POSITION 0
AS
BEGIN
  /* Trigger body */
  IF (NEW.CODDOCUMENTO IS NULL) THEN
      CODDOCUMENTO = GEN_ID(DOCUMENTOS_CODDOCUMENTO_GEN, 1);  
END;

Este es el error:
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
CODDOCUMENTO.
At line 8, column 7.



Alguien tiene ejemplos hechos por él de triggers? Podría mostrar alguno?
No entiendo por qué da error en los nombres de los campos, que están correctamente escritos.

Delphius 21-09-2011 02:06:14

Hola,
¿Antoniov llevas ya tiempo pegado frente a la PC?
De ser así sugiero que descanses... despégate de la computadora. Duerme bien y pon tu mente en blanco.
Cuando te hayas despejado siéntate porque debo darte unas noticias que te pondrán más furioso. ¿Me creerías si te digo que tu error es de esos bien tontos y que te rompen la cabeza por nada? Si... es de esos ¡no mates al mensajero! :D

Fíjate que en la línea 8, columna 7 dice CODDOCUMENTO. Allí falta algo... ¡NEW!
Y también en la declaración del triggers falta el FOR <tabla> ;)

Saludos,

jacanche 21-09-2011 03:52:52

Hola antonio, en los triggers AFTER no puedes modificar valores de la misma tabla. Para cambiar los valores del registro que se esta insertando se usan los triggers BEFORE INSERT, para los valores que se estan actualizando el trigger BEFORE UPDATE.
Cuando se ejecutan los eventos AFTER (AFTER INSERT/AFTER UPDATE) ya los registros han sido almacenados en la base de datos, todavia se tiene acceso al registro NEW pero ya no se le pueden asignar valores.

Antoniov 21-09-2011 18:45:56

Solucionado
 
Gracias por vuestra ayuda.

Al final, el problema real no era tan real.

Para gestionar la base de datos uso el programa SQL Manager Lite 2008. Es una versión GRATUITA que sacaron y que luego quitaron. Si alguien la quiere se la puedo enviar.

Es genial, te permite crear y manipular una base de datos (Firebird, Interbase, ....) incluso sin apenas tener idea de SQL ni de nada.

Pero tiene algunos bugs, y anoche encontré uno más.

Cuando escribes un Script y lo compilas, si da error la primera vez, ya no encuentro forma de que la compilación funcione, por más que lo corrijas.

Hay que copiar el script, anular los cambios. Creas uno nuevo y le pegas el script que daba error y ya está.

De lo contrario no hay forma.

Si alguien lo usa me lo dice y le comento otros bugs que he encontrado y que le he buscado una alternativa.

Un saludo y gracias

Casimiro Notevi 21-09-2011 19:04:23

Mejor será usar otro sql manager :)

Delphius 21-09-2011 19:13:56

Utiliza IBExpert que tiene una versión gratuita aunque no completa. Pero lo que tienes es por lo lejos más de lo que te imaginas... Si la edición Personal es limitada, ¡no quiero ni pensar como será la completa!

Y también está FlameRobin que Open Source y además Multiplataforma.

Con IBExpert y FlameRobin dejarás atrás las renegadas.

Saludos,


La franja horaria es GMT +2. Ahora son las 01:44:33.

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