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 18: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 20: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 23: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 18-06-2011 00: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 18-06-2011 00: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 09:07:32

Hola

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

Panta

guillotmarc 18-06-2011 15: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 19: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 02: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 04: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 08: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 01: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 Noteví 23-06-2011 02:04:43

No olvides las etiquetas para el código fuente.




.

guillotmarc 23-06-2011 10:44:12

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

Saludos.

ecfisa 23-06-2011 15: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 18: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 18: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 18: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 18: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 18:39:49

Perfecto si con esa sintaxis me deja guardarlo y funciona

Gracias....:)


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

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