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)
-   -   trigger a nivel de campo (https://www.clubdelphi.com/foros/showthread.php?t=12337)

carlomagno 13-07-2004 17:12:07

trigger a nivel de campo
 
Hola a todos

Alguien sabe si se puede hacer un trigger a nivel de campo?
Es decir, si un campo determinado de una tabla se modifica, que salte el trigger asociado.
Supongo que poniendo una condicion en el trigger se podria acotar la ejecucion pero no se si se puede hacer lo otro comentado.

Gracias a todos

guillotmarc 13-07-2004 19:13:41

Hola.

En efecto, se tiene que hacer mediante una condición en el trigger.

if new.campo <> old.campo then ....

Nota: debido a la forma especial en que operan los campos nulos, la condición realmente deberia ser :

if new.campo <> old.campo or (new.campo is null and old.campo is not null) or (new.campo is not null and old.campo is null) then ....

Saludos.

amerika111 17-06-2011 22:26:36

si lo que busco es actualizar un campo despues de una insercion como seria la sintaxis

CREATE trigger NombreCompleto for Solicitud
active after insert,update position 0
AS
begin
new.Nombre_Completo=(select paterno|| ' ' || materno || ' ' || nombre )

end

algo asi...

guillotmarc 17-06-2011 23:06:32

Cita:

Empezado por amerika111 (Mensaje 404139)
si lo que busco es actualizar un campo despues de una insercion como seria la sintaxis

CREATE trigger NombreCompleto for Solicitud
active after insert,update position 0
AS
begin
new.Nombre_Completo=(select paterno|| ' ' || materno || ' ' || nombre )

end

algo asi...

Sí, algo así.

CREATE trigger NombreCompleto for Solicitud
active after insert,update position 0
AS
begin
new.Nombre_Completo = new.paterno|| ' ' || new.materno || ' ' || new.nombre
end

Saludos.

amerika111 17-06-2011 23:34:32

pero me marca este error....


ISC ERROR CODE:335544569
ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code=-104
Token unknown -line 18, char 1
end

SET TERM ^^ ;
CREATE TRIGGER AAAAAA_A_EJEMPLO FOR AAAAAA_A ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
new.NOMBRECOMPLETO= new.APA1|| ' ' ||new.APE2|| ' ' ||new.NOMBRE
end ^^

celades1 18-06-2011 08:07:32

Hola

Te falta el ; al final de la linea de la asignación del campo

Panta

guillotmarc 18-06-2011 14:13:13

Además de añadir el punto y coma que indica celades1, yo tendría en cuenta el hecho de que a veces alguna de las partes del nombre puede ser nula, lo que provocaría que todo el nombre completo sea nulo (cualquier valor operado con nulo da como resultado otro nulo).

Para solventarlo se puede usar la función coalesce.

CREATE trigger NombreCompleto for Solicitud
active after insert,update position 0
AS
begin
new.Nombre_Completo = coalesce(new.paterno || ' ', '') || coalesce(new.materno || ' ', '') || coalesce(new.nombre, '');
end

Saludos.

amerika111 20-06-2011 18:09:19

Cita:

Empezado por guillotmarc (Mensaje 404179)
Además de añadir el punto y coma que indica celades1, yo tendría en cuenta el hecho de que a veces alguna de las partes del nombre puede ser nula, lo que provocaría que todo el nombre completo sea nulo (cualquier valor operado con nulo da como resultado otro nulo).

Para solventarlo se puede usar la función coalesce.

CREATE trigger NombreCompleto for Solicitud
active after insert,update position 0
AS
begin
new.Nombre_Completo = coalesce(new.paterno || ' ', '') || coalesce(new.materno || ' ', '') || coalesce(new.nombre, '');
end

Saludos.


No he logrado crear el trigger marca el siguiente error, pense que podria ser por palabre new asi que la cambie a old pero arroja el mismo error

amerika111 21-06-2011 01:49:09

No me deja crear el trigger en tiempo after solo before... a que se debera, en after me arroja el error de la parte de arriba

ecfisa 21-06-2011 03:36:48

Hola.

Pareciera que tu código dice:
Código SQL [-]
CREATE TRIGGER AAAAAA_A_NOMBRE FOR AAAAAA_AACTIVE ...
Digo pareciera por que no puedo apreciar bién la imágen que has puesto, si es exáctamente asi, es un problema de sintáxis.
Debería haber un espacio antes de ACTIVE:
Código SQL [-]
CREATE TRIGGER AAAAAA_A_NOMBRE FOR AAAAAA_A ACTIVE ...

Saludos.

celades1 21-06-2011 07:38:34

Hola

Es correcto, para asignar valores solo se puede hacer en triggers before
ya sea BI o BU

Lo cual me parece logico

Saludos

amerika111 23-06-2011 00:30:38

tengo una duda en este tipo de trigger por que podria estar marcando error
lo he cambiado a after before y nada de nada


Código SQL [-]
SET TERM ^^ ;
CREATE TRIGGER EMPLEADOSACTIVOS_EDOCIVIL FOR EMPLEADOSACTIVOS ACTIVE AFTER INSERT OR UPDATE POSITION 4 AS
begin
  IF (NEW.ESTADOCIVIL IS NULL ) 
  NEW.ESTADOCIVIL='SOLTERO';   
  END
  IF (NEW.ESTADOCIVIL='S') 
  NEW.ESTADOCIVIL='SOLTERO';  
  END
  IF (NEW.ESTADOCIVIL='C')
  NEW.ESTADOCIVIL='CASADO';
  END
  IF (NEW.ESTADOCIVIL='U')
  NEW.ESTADOCIVIL='UNION LIBRE';
  END
end ^^
SET TERM ; ^^

Casimiro Notevi 23-06-2011 01:04:43

No olvides las etiquetas para el código fuente.




.

guillotmarc 23-06-2011 09:44:12

¿ Que error marca ?, ¿ no te dice en que linea se encuentra ?.

Saludos.

ecfisa 23-06-2011 14:08:42

Cita:

Empezado por amerika111 (Mensaje 404547)
tengo una duda en este tipo de trigger por que podria estar marcando error
lo he cambiado a after before y nada de nada

Hola.

En principio tenes incompleta la declaración del condicional, lo correcto es:
Código SQL [-]
SET TERM ^^ ;
CREATE TRIGGER EMPLEADOSACTIVOS_EDOCIVIL FOR EMPLEADOSACTIVOS 
ACTIVE AFTER INSERT OR UPDATE 
POSITION 4 AS
BEGIN
  IF(NEW.ESTADOCIVIL IS NULL ) THEN  /* <--- */
    NEW.ESTADOCIVIL='SOLTERO';   
  ...
  ...
END ^^
SET TERM ; ^^

Saludos.

amerika111 23-06-2011 17:07:30

Cita:

Empezado por ecfisa (Mensaje 404586)
Hola.

En principio tenes incompleta la declaración del condicional, lo correcto es:

Código SQL [-]SET TERM ^^ ;
CREATE TRIGGER EMPLEADOSACTIVOS_EDOCIVIL FOR EMPLEADOSACTIVOS
ACTIVE AFTER INSERT OR UPDATE
POSITION 4 AS
BEGIN
IF(NEW.ESTADOCIVIL IS NULL ) THEN /* <--- */
NEW.ESTADOCIVIL='SOLTERO';
...
...
END ^^
SET TERM ; ^^





Saludos.

Lo he intentado asi y me sigue marcando error


Código SQL [-]
begin
IF (NEW.ESTADOCIVIL IS NULL ) THEN
   NEW.ESTADOCIVIL='SOLTERO';   
  END
  IF (NEW.ESTADOCIVIL='S') THEN
  NEW.ESTADOCIVIL='SOLTERO';  
  END
  IF (NEW.ESTADOCIVIL='C') THEN
  NEW.ESTADOCIVIL='CASADO';
  END
  IF (NEW.ESTADOCIVIL='U') THEN
  NEW.ESTADOCIVIL='UNION LIBRE';
  END
end

ecfisa 23-06-2011 17:12:22

Hola amerika111.

Como bién ha dicho guillotmarc:
Cita:

Empezado por guillotmarc (Mensaje 404560)
¿ Que error marca ?, ¿ no te dice en que linea se encuentra ?.

Saludos.

Dicho de otra forma: Ponenos literalmente el texto del mensaje de error y la línea donde se produce. Sin eso no creo que podamos darte mucha ayuda...

Saludos.

amerika111 23-06-2011 17:15:11

Cita:

Empezado por guillotmarc (Mensaje 404560)
¿ Que error marca ?, ¿ no te dice en que linea se encuentra ?.

Saludos.

El error que marca es el siguiente...

ecfisa 23-06-2011 17:25:32

Hola.

Probá de este modo:
Código SQL [-]
BEGIN
  IF (NEW.ESTADOCIVIL IS NULL ) THEN
    NEW.ESTADOCIVIL='SOLTERO';   

  IF (NEW.ESTADOCIVIL='S') THEN
    NEW.ESTADOCIVIL='SOLTERO';  

  IF (NEW.ESTADOCIVIL='C') THEN
    NEW.ESTADOCIVIL='CASADO';

  IF (NEW.ESTADOCIVIL='U') THEN
    NEW.ESTADOCIVIL='UNION LIBRE';
END

Saludos.

amerika111 23-06-2011 17:39:49

Perfecto si con esa sintaxis me deja guardarlo y funciona

Gracias....:)


La franja horaria es GMT +2. Ahora son las 11:08:27.

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