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:%
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)




Respuesta Responder a este mensaje
#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:%
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)




Respuesta Responder a este mensaje
#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:

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)





Respuesta Responder a este mensaje
#4 Berta Gomez
05/04/2005 - 17:20 | Informe spam
Hola, lo que no entiendo es porque haces un UNION con la Inserted -


Deleted?
ahi puedes tener registros repetidos :(



Pensaba que no se repetian si no ponia UNION ALL. No es asi ?
Respuesta Responder a este mensaje
#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:
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:%
> 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)
>
>
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida