Ayuda con un trigger please

05/04/2005 - 15:39 por Berta Gomez | Informe spam
Un tabla OBRAS tiene un estatus (0-activa 1-rescindida). Ese campo debo
actualizarlo cuando se registra un contrato de rescicion en la tabla
CONTRATOS, en este caso cuando el campo CONTRATOS.tipo = 5 (flag de
rescision). El asunto es que CONTRATOS tiene otro campo estatus (0-activo
1-inactivo). Si el contrato se inactiva aun su tipo sea 5 (rescision), la
obra debe quedar como que no esta rescindida. El contrato posee un campo
Obra para referenciar la obra a la cual se refiere.

He hecho este trigger despues de muuuuucho pensar, para (insert, update y
delete ) en la tabla CONTRATOS y me gustaria me dieran una opinion pues no
estoy muy clara porque me funciona para rescindir la obra pero si se marca
como inactivo el contrato de rescision no me funciona.

for insert,update, delete
..
..
UPDATE OBRAS
SET OBRAS.STAT=1
from OBRAS inner join (select obra from INSERTED union select obra from
DELETED) contratosmodificados on OBRAS.obra=contratosmodificados.obra
WHERE EXISTS( select contrato from CONTRATOS where CONTRATOS.obra=OBRAS.obra
and CONTRATOS.tipo=3 and CONTRATOS.stat=1)

Preguntas similare

Leer las respuestas

#1 Ricardo Passians
05/04/2005 - 16:08 | Informe spam
Hola Berta:

A ver si entiendo. Arriba dice que CONTRATOS.tipo = 5 para cuando es un
contrato de rescision pero en el where pusiste tipo=3. Imagino que fue un
error.

Prueba quitando el where y poniendo un Case When Then End, a ver si te
funciona para todos los casos:
(ojo:debes chequear si hay algun error de sintaxis)

UPDATE OBRAS SET OBRAS.STAT case when (EXISTS(select contrato from CONTRATOS where
CONTRATOS.obra=OBRAS.obra and CONTRATOS.tipo=5 and CONTRATOS.stat=1))
then 1 else 0 end
from OBRAS inner join (select obra from INSERTED union select obra from
DELETED) modificados on OBRAS.obra=modificados.obra



"Berta Gomez" wrote in message
news:%
Mostrar la cita
CONTRATOS.obra=OBRAS.obra
Mostrar la cita
#2 Maxi
05/04/2005 - 16:13 | Informe spam
Hola, lo que no entiendo es porque haces un UNION con la Inserted - Deleted?
ahi puedes tener registros repetidos :(

Otro temita, este tipo de logica a mi no me gusta ponerla en un trigger, me
parece que lo mas limpio seria ponerla en tus Sp's de proceso :-)


Salu2
Maxi


"Berta Gomez" escribió en el mensaje
news:%
Mostrar la cita
#3 Alejandro Mesa
05/04/2005 - 16:19 | Informe spam
Berta,

esta regla de negocio es un poquito complicada, por lo que yo la separaria
en tres triggers diferentes, uno para insert, otro para update y un ultimo
para delete.

UPDATE OBRAS
SET OBRAS.STAT = 1
from OBRAS
WHERE EXISTS(
select
*
from
inserted as i
where
i.obra = OBRAS.obra
and i.tipo = 5
and i.stat = 1
)

modifico un
UPDATE OBRAS
SET OBRAS.STAT = (select i.stat from inserted as i inner join deleted as d
on i.contrato_id = d.contrato_id and i.tipo = 5 and i.stat != d.stat where
i.obra = OBRAS.obra)
from OBRAS
WHERE EXISTS(
select
*
from
inserted as i
inner join
deleted as d
on i.contrato_id = d.contrato_id
and i.tipo = 5
and i.stat != d.stat
where
i.obra = OBRAS.obra
)

asociado
UPDATE OBRAS
SET OBRAS.STAT = 0
from OBRAS
WHERE
OBRAS.STAT = 1 and
EXISTS(
select
*
from
delete as d
where
d.obra = OBRAS.obra
and d.tipo = 5
and d.stat = 1
)

Dejame saber si funciona para poder ayudarte.


AMB

"Berta Gomez" wrote:

Mostrar la cita
#4 Berta Gomez
05/04/2005 - 17:20 | Informe spam
Mostrar la cita
Deleted?
Mostrar la cita
Pensaba que no se repetian si no ponia UNION ALL. No es asi ?
#5 Berta Gomez
05/04/2005 - 17:22 | Informe spam
Gracias Ricardo

Lo he estado probando y ha estado funcionando bien. No tenia ni idea que se
podia armar un select en un case.

Berta


"Ricardo Passians" wrote in message
news:
Mostrar la cita
debo
Mostrar la cita
(0-activo
Mostrar la cita
la
Mostrar la cita
y
Mostrar la cita
no
Mostrar la cita
marca
Mostrar la cita
Ads by Google
Search Busqueda sugerida