Triggers de varios registros

18/09/2003 - 09:15 por Barrish | Informe spam
Hola a todos,

tengo el siguiente trigger en una tabla de detalles de albaranes:


CREATE TRIGGER "DetalleAlbaranes_Delete"
ON dbo.DetalleAlbaranes
FOR DELETE
AS
/* Trigger que controla el número de pares servidos en cada partida */
DECLARE @Pares smallint,
@Pedido varchar(10),
@Folio varchar(10)

select @Pares=Pares FROM deleted
select @Pedido=Pedido FROM deleted
select @Folio=Folio FROM deleted

IF @Pedido<>'' AND @Folio<>'' AND @Pares<>0
UPDATE Pedidos SET ServAlbaran=ServAlbaran - @Pares
WHERE Pedido=@Pedido AND Folio=@Folio


Funciona perfectamente cuando se borran lineas de albaran, pero no cuando se
borra un albaran entero y, por consiguiente todas sus lineas.
Supongo que es porque sólo se activa el trigger una vez en lugar de por
todas las lineas.
Mi pregunta es cómo puedo hacer para recorrer todas las lineas. He visto un
ejemplo en la ayuda, pero no me sirve porque realiza una suma de todas las
lineas en lugar de aplicar el nº de pares por cada linea.

Gracias y un saludo

Preguntas similare

Leer las respuestas

#1 José Raúl Fenollar Martínez
18/09/2003 - 10:07 | Informe spam
Tienes que controlar que en la tabla deleted el count(*) > 1, lo que
signfica que hay varias lineas eliminadas, y despues hacer un cursor sobre
la tabla deleted, para procesar 1 a 1 los registros.



"Barrish" wrote in message
news:O8$
Hola a todos,

tengo el siguiente trigger en una tabla de detalles de albaranes:


CREATE TRIGGER "DetalleAlbaranes_Delete"
ON dbo.DetalleAlbaranes
FOR DELETE
AS
/* Trigger que controla el número de pares servidos en cada partida */
DECLARE @Pares smallint,
@Pedido varchar(10),
@Folio varchar(10)

select @Pares=Pares FROM deleted
select @Pedido=Pedido FROM deleted
select @Folio=Folio FROM deleted

IF @Pedido<>'' AND @Folio<>'' AND @Pares<>0
UPDATE Pedidos SET ServAlbaran=ServAlbaran - @Pares
WHERE Pedido=@Pedido AND Folio=@Folio


Funciona perfectamente cuando se borran lineas de albaran, pero no cuando


se
borra un albaran entero y, por consiguiente todas sus lineas.
Supongo que es porque sólo se activa el trigger una vez en lugar de por
todas las lineas.
Mi pregunta es cómo puedo hacer para recorrer todas las lineas. He visto


un
ejemplo en la ayuda, pero no me sirve porque realiza una suma de todas las
lineas en lugar de aplicar el nº de pares por cada linea.

Gracias y un saludo


Respuesta Responder a este mensaje
#2 Barrish
18/09/2003 - 10:14 | Informe spam
Me contesto a mí mismo, por si a alguien le interesa.
He creado un cursor para recorrer las lineas, aunque por lo que he leido en
este foro, no es muy recomendable.
Es la primera vez que creo un cursor, por lo que si alguien quiere comentar
si lo he hecho correctamente o si hay alguna solución mejor, se lo
agradecería.

Este es el trigger:

CREATE TRIGGER "DetalleAlbaranes_Delete"
ON dbo.DetalleAlbaranes
FOR DELETE
AS

/* Trigger que controla el número de pares servidos en cada partida */

/* Creamos un cursor para recorrer todas las lineas borradas */
DECLARE DeleteCursor CURSOR FAST_FORWARD
FOR SELECT Pedido,Folio,Pares FROM deleted
WHERE Pedido<>'' AND Folio<>'' AND Pares<>0

DECLARE @Pares smallint,
@Pedido varchar(10),
@Folio varchar(10)

OPEN DeleteCursor
FETCH NEXT FROM DeleteCursor
INTO @Pedido, @Folio, @Pares

/* Bucle de las lineas */
WHILE @@FETCH_STATUS = 0
BEGIN

UPDATE Pedidos SET ServAlbaran=ServAlbaran - @Pares
WHERE Pedido=@Pedido AND Folio=@Folio
FETCH NEXT FROM DeleteCursor
INTO @Pedido, @Folio, @Pares
END

CLOSE DeleteCursor
DEALLOCATE DeleteCursor


Gracias y un saludo
Respuesta Responder a este mensaje
#3 Barrish
18/09/2003 - 10:34 | Informe spam
Gracias José, me he respondido a mí mismo y no había visto tu mensaje.
Un saludo.

"José Raúl Fenollar Martínez" escribió en el mensaje
news:#
Tienes que controlar que en la tabla deleted el count(*) > 1, lo que
signfica que hay varias lineas eliminadas, y despues hacer un cursor sobre
la tabla deleted, para procesar 1 a 1 los registros.



"Barrish" wrote in message
news:O8$
> Hola a todos,
>
> tengo el siguiente trigger en una tabla de detalles de albaranes:
>
>
> CREATE TRIGGER "DetalleAlbaranes_Delete"
> ON dbo.DetalleAlbaranes
> FOR DELETE
> AS
> /* Trigger que controla el número de pares servidos en cada partida */
> DECLARE @Pares smallint,
> @Pedido varchar(10),
> @Folio varchar(10)
>
> select @Pares=Pares FROM deleted
> select @Pedido=Pedido FROM deleted
> select @Folio=Folio FROM deleted
>
> IF @Pedido<>'' AND @Folio<>'' AND @Pares<>0
> UPDATE Pedidos SET ServAlbaran=ServAlbaran - @Pares
> WHERE Pedido=@Pedido AND Folio=@Folio
>
>
> Funciona perfectamente cuando se borran lineas de albaran, pero no


cuando
se
> borra un albaran entero y, por consiguiente todas sus lineas.
> Supongo que es porque sólo se activa el trigger una vez en lugar de por
> todas las lineas.
> Mi pregunta es cómo puedo hacer para recorrer todas las lineas. He visto
un
> ejemplo en la ayuda, pero no me sirve porque realiza una suma de todas


las
> lineas en lugar de aplicar el nº de pares por cada linea.
>
> Gracias y un saludo
>
>


Respuesta Responder a este mensaje
#4 Manuel \(Salamanca\)
18/09/2003 - 10:39 | Informe spam
Hola,
puedes hacer pruebas con esto...

UPDATE Pedidos
SET ServAlbaran=ServAlbaran - Deleted.Pares
FROM Pedidos, Deleted
WHERE Pedidos.Pedido = Deleted.Pedido AND Pedido.Folio = Deleted.Folio

De todas formas, si nos mandas los scripts de tus tablas, y unos datos de
ejemplo podremos estudiar mejor una solucion para que tengas que utilizar el
cursor.
Un saludo.

Manuel Lima.




"Barrish" escribió en el mensaje
news:%
Me contesto a mí mismo, por si a alguien le interesa.
He creado un cursor para recorrer las lineas, aunque por lo que he leido


en
este foro, no es muy recomendable.
Es la primera vez que creo un cursor, por lo que si alguien quiere


comentar
si lo he hecho correctamente o si hay alguna solución mejor, se lo
agradecería.

Este es el trigger:

CREATE TRIGGER "DetalleAlbaranes_Delete"
ON dbo.DetalleAlbaranes
FOR DELETE
AS

/* Trigger que controla el número de pares servidos en cada partida */

/* Creamos un cursor para recorrer todas las lineas borradas */
DECLARE DeleteCursor CURSOR FAST_FORWARD
FOR SELECT Pedido,Folio,Pares FROM deleted
WHERE Pedido<>'' AND Folio<>'' AND Pares<>0

DECLARE @Pares smallint,
@Pedido varchar(10),
@Folio varchar(10)

OPEN DeleteCursor
FETCH NEXT FROM DeleteCursor
INTO @Pedido, @Folio, @Pares

/* Bucle de las lineas */
WHILE @@FETCH_STATUS = 0
BEGIN

UPDATE Pedidos SET ServAlbaran=ServAlbaran - @Pares
WHERE Pedido=@Pedido AND Folio=@Folio
FETCH NEXT FROM DeleteCursor
INTO @Pedido, @Folio, @Pares
END

CLOSE DeleteCursor
DEALLOCATE DeleteCursor


Gracias y un saludo


Respuesta Responder a este mensaje
#5 Manuel \(Salamanca\)
18/09/2003 - 10:44 | Informe spam
Hola,
que se me olvidó poner las condiciones del where...

UPDATE Pedidos
SET ServAlbaran=ServAlbaran - Deleted.Pares
FROM Pedidos, Deleted
WHERE Pedidos.Pedido = Deleted.Pedido AND Pedido.Folio = Deleted.Folio
AND Deleted.Pedido<>'' AND Deleted.Folio<>'' AND Deleted.Pares<>0


Un saludo.

Manuel Lima.



=SALVA A SQL,
MATA UN CURSOR
Manuel Lima
"Barrish" escribió en el mensaje
news:O8$
Hola a todos,

tengo el siguiente trigger en una tabla de detalles de albaranes:


CREATE TRIGGER "DetalleAlbaranes_Delete"
ON dbo.DetalleAlbaranes
FOR DELETE
AS
/* Trigger que controla el número de pares servidos en cada partida */
DECLARE @Pares smallint,
@Pedido varchar(10),
@Folio varchar(10)

select @Pares=Pares FROM deleted
select @Pedido=Pedido FROM deleted
select @Folio=Folio FROM deleted

IF @Pedido<>'' AND @Folio<>'' AND @Pares<>0
UPDATE Pedidos SET ServAlbaran=ServAlbaran - @Pares
WHERE Pedido=@Pedido AND Folio=@Folio


Funciona perfectamente cuando se borran lineas de albaran, pero no cuando


se
borra un albaran entero y, por consiguiente todas sus lineas.
Supongo que es porque sólo se activa el trigger una vez en lugar de por
todas las lineas.
Mi pregunta es cómo puedo hacer para recorrer todas las lineas. He visto


un
ejemplo en la ayuda, pero no me sirve porque realiza una suma de todas las
lineas en lugar de aplicar el nº de pares por cada linea.

Gracias y un saludo


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