Trigger para Delete

02/09/2008 - 08:43 por Angel Zapata | Informe spam
Hola compañeros,

tengo una tabla con el historico de una serie de movimientos, y he creado un desencadenador
para que cuando se grabe un movimiento nuevo actualice las existencias de dicho articulo en el
almacen correspondiente, y otro para cuando se borra un registro, el problema es que cuando se
inserta un registro todo funciona pero cuando se borra no hace nada.

No encuentro el porque no funciona, lo que si se es que si le indico, en la clausula WHERE el
número de movimiento genera un error, y si no lo indico es totalmente imprevisible.

¿Alguna sugerencia?

/*Desencadenador para borrar*/
ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico + MovimientoCantidad
FROM AlmacenMovimientosConcertacion
WHERE AlmacenMovimientosConcertacion.MovimientoNumero IN (SELECT MovimientoNumero FROM Deleted)
AND AlmacenExistencias.AlmacenCodigo IN (SELECT MovimientoAlmacen FROM Deleted)
AND AlmacenExistencias.ArticuloCodigo IN (SELECT MovimientoArticulo FROM Deleted)



/*Desencadenador para insertar*/
ALTER TRIGGER AlmacenMovimientosConcertacionNuevo
ON AlmacenMovimientosConcertacion
FOR INSERT
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico - MovimientoCantidad
FROM AlmacenMovimientosConcertacion
WHERE AlmacenMovimientosConcertacion.MovimientoNumero IN (SELECT MovimientoNumero FROM Inserted)
AND AlmacenExistencias.AlmacenCodigo IN (SELECT MovimientoAlmacen FROM Inserted)
AND AlmacenExistencias.ArticuloCodigo IN (SELECT MovimientoArticulo FROM Inserted)
Angel Zapata
Siglhogar XXI S.L.
"Si no sabes hacia adonde vas, lo mas probable es que no llegues a ninguna parte"

Preguntas similare

Leer las respuestas

#1 georgeguitar.jorge
02/09/2008 - 15:06 | Informe spam
Hola Angel: La verda yo tampoco veo el problema, pero proba haciendo
lo siguiente:

ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico +
MovimientoCantidad
FROM AlmacenMovimientosConcertacion A
INNER JOIN Deleted D On A.MovimientoNumero D.MovimientoNumero
INNER JOIN AlmacenExistencias E On
D.MovimientoAlmacen = E.AlmacenCodigo And D.MovimientoArticulo E.ArticuloCodigo

Puede que el al forzar una relacion entre la table Deleted y las otras
tablas te ayude.

Espero te sirva. Saludos.
Respuesta Responder a este mensaje
#2 Angel Zapata
02/09/2008 - 16:46 | Informe spam
Hola George,

no ha funcionado el resultado es el mismo.

Y lo que es peor, no tengo ni idea de por donde buscar la solucion.


Angel Zapata
Siglhogar XXI S.L.
"Si no sabes hacia adonde vas, lo mas probable es que no llegues a ninguna parte"

escribió:
Hola Angel: La verda yo tampoco veo el problema, pero proba haciendo
lo siguiente:

ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico +
MovimientoCantidad
FROM AlmacenMovimientosConcertacion A
INNER JOIN Deleted D On A.MovimientoNumero > D.MovimientoNumero
INNER JOIN AlmacenExistencias E On
D.MovimientoAlmacen = E.AlmacenCodigo And D.MovimientoArticulo > E.ArticuloCodigo

Puede que el al forzar una relacion entre la table Deleted y las otras
tablas te ayude.

Espero te sirva. Saludos.

Respuesta Responder a este mensaje
#3 Alejandro Mesa
02/09/2008 - 17:20 | Informe spam
Angel,

Siempre ten en cuenta que los triggers se disparan por cada operacion y no
por cada fila afectada por la operacion. en otras palabras, debes tener en
cuenta que una operacion puede afectar multiples filas.

Trata:

ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

IF @@rowcount = 0
return

set nocount on

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico + (
select sum(d.MovimientoCantidad)
from Deleted as d
where d.MovimientoArticulo = AlmacenExistencias.ArticuloCodigo
)
where
exists (
select *
from deleted as d
where d.MovimientoArticulo = AlmacenExistencias.ArticuloCodigo
)
GO


AMB


"Angel Zapata" wrote:

Hola compañeros,

tengo una tabla con el historico de una serie de movimientos, y he creado un desencadenador
para que cuando se grabe un movimiento nuevo actualice las existencias de dicho articulo en el
almacen correspondiente, y otro para cuando se borra un registro, el problema es que cuando se
inserta un registro todo funciona pero cuando se borra no hace nada.

No encuentro el porque no funciona, lo que si se es que si le indico, en la clausula WHERE el
número de movimiento genera un error, y si no lo indico es totalmente imprevisible.

¿Alguna sugerencia?

/*Desencadenador para borrar*/
ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico + MovimientoCantidad
FROM AlmacenMovimientosConcertacion
WHERE AlmacenMovimientosConcertacion.MovimientoNumero IN (SELECT MovimientoNumero FROM Deleted)
AND AlmacenExistencias.AlmacenCodigo IN (SELECT MovimientoAlmacen FROM Deleted)
AND AlmacenExistencias.ArticuloCodigo IN (SELECT MovimientoArticulo FROM Deleted)



/*Desencadenador para insertar*/
ALTER TRIGGER AlmacenMovimientosConcertacionNuevo
ON AlmacenMovimientosConcertacion
FOR INSERT
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico - MovimientoCantidad
FROM AlmacenMovimientosConcertacion
WHERE AlmacenMovimientosConcertacion.MovimientoNumero IN (SELECT MovimientoNumero FROM Inserted)
AND AlmacenExistencias.AlmacenCodigo IN (SELECT MovimientoAlmacen FROM Inserted)
AND AlmacenExistencias.ArticuloCodigo IN (SELECT MovimientoArticulo FROM Inserted)
Angel Zapata
Siglhogar XXI S.L.
"Si no sabes hacia adonde vas, lo mas probable es que no llegues a ninguna parte"

Respuesta Responder a este mensaje
#4 Angel Zapata
02/09/2008 - 17:44 | Informe spam
Hola Alejandro,

ahora si ha funcionado, pero en cualquier caso el número de registros afectados sería uno solamente
para cada operación de borrado, ya que las pruebas las he hecho directamente a la base de datos y
con la aplicación, por lo que mi asombro era mayor.

Muchas gracias

Angel Zapata
Siglhogar XXI S.L.
"Si no sabes hacia adonde vas, lo mas probable es que no llegues a ninguna parte"

Alejandro Mesa escribió:
Angel,

Siempre ten en cuenta que los triggers se disparan por cada operacion y no
por cada fila afectada por la operacion. en otras palabras, debes tener en
cuenta que una operacion puede afectar multiples filas.

Trata:

ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

IF @@rowcount = 0
return

set nocount on

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico + (
select sum(d.MovimientoCantidad)
from Deleted as d
where d.MovimientoArticulo = AlmacenExistencias.ArticuloCodigo
)
where
exists (
select *
from deleted as d
where d.MovimientoArticulo = AlmacenExistencias.ArticuloCodigo
)
GO


AMB


"Angel Zapata" wrote:

Hola compañeros,

tengo una tabla con el historico de una serie de movimientos, y he creado un desencadenador
para que cuando se grabe un movimiento nuevo actualice las existencias de dicho articulo en el
almacen correspondiente, y otro para cuando se borra un registro, el problema es que cuando se
inserta un registro todo funciona pero cuando se borra no hace nada.

No encuentro el porque no funciona, lo que si se es que si le indico, en la clausula WHERE el
número de movimiento genera un error, y si no lo indico es totalmente imprevisible.

¿Alguna sugerencia?

/*Desencadenador para borrar*/
ALTER TRIGGER AlmacenMovimientosConcertacionBorrado
ON dbo.AlmacenMovimientosConcertacion
FOR DELETE
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico + MovimientoCantidad
FROM AlmacenMovimientosConcertacion
WHERE AlmacenMovimientosConcertacion.MovimientoNumero IN (SELECT MovimientoNumero FROM Deleted)
AND AlmacenExistencias.AlmacenCodigo IN (SELECT MovimientoAlmacen FROM Deleted)
AND AlmacenExistencias.ArticuloCodigo IN (SELECT MovimientoArticulo FROM Deleted)



/*Desencadenador para insertar*/
ALTER TRIGGER AlmacenMovimientosConcertacionNuevo
ON AlmacenMovimientosConcertacion
FOR INSERT
AS

UPDATE AlmacenExistencias
SET ExistenciasFisico = ExistenciasFisico - MovimientoCantidad
FROM AlmacenMovimientosConcertacion
WHERE AlmacenMovimientosConcertacion.MovimientoNumero IN (SELECT MovimientoNumero FROM Inserted)
AND AlmacenExistencias.AlmacenCodigo IN (SELECT MovimientoAlmacen FROM Inserted)
AND AlmacenExistencias.ArticuloCodigo IN (SELECT MovimientoArticulo FROM Inserted)
Angel Zapata
Siglhogar XXI S.L.
"Si no sabes hacia adonde vas, lo mas probable es que no llegues a ninguna parte"

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida