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

#6 Javier Loria
18/09/2003 - 14:14 | Informe spam
Hola:
Una alternativa mucho mas rapida es usar SQL como un lenguaje para el
acceso de CONJUNTOS de DATOS y no como un lenguaje de procedimientos. La
siguiente setencia (espero que corra porque no he podido probarla), debe ser
de 100 a 1000 veces mas rapida que un cursor:
/* Inicio de Codigo Trigger */
UPDATE Pedidos
SET ServAlbaran=ServAlbaran-D.Pares
FROM Pedidos JOIN
(SELECT Pedido, Folio, SUM(Pares) as Pares
FROM Deleted
GROUP BY Pedido, Folio) AS D
ON Pedidos.Pedido=D.Pedido AND Pedidos.Folio=D.Folio
/* Fin de Codigo Trigger */
Me queda la duda de la razon para almacenar Pares como una columna de
Pedidos si podrias crear una vista de Pedidos con sus Pares? Algo como:
/* Inicio de Codigo Vista */
SELECT Col1, Col2, ..., SUM(Pares)
FROM Pedidos JOIN DetalleAlbaranes ON
ON Pedidos.Pedido=DetalleAlbaranes.Pedido
AND Pedidos.Folio=DetalleAlbaranes.Folio
GROUP BY Col1, Col2,
/* Inicio de Codigo Vista */

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

José Raúl Fenollar Martínez escribio:
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
#7 Barrish
19/09/2003 - 13:14 | Informe spam
Perfecto, Javier. :-)))
El trigger funciona a la perfección quedando mucho más compacto y más
eficiente.

Sobre crear la vista de almacenar pares como una columna de pedidos, no es
posible. Porque en realidad "Pedidos" no es el maestro de
"DetalleAlbaranes".
Pedidos es la tabla en donde se insertan los pedidos que realizan los
clientes. En esta tabla existe un campo llamado "ServAlbaran" que indica el
número de pares servidos, que se actualiza mediante el trigger comentado,
cada vez que se inserta, modifica o elimina una linea de albaran que hace
referencia a dicho pedido.

Pero, en realidad, con este trigger queda totalmente solucionado.
Muchas gracias
Un foro fantástico. Si señor.
Saludos


From: "Javier Loria"
Newsgroups: microsoft.public.es.sqlserver
Sent: Thursday, September 18, 2003 2:14 PM
Subject: Re: Triggers de varios registros


Hola:
Una alternativa mucho mas rapida es usar SQL como un lenguaje para el
acceso de CONJUNTOS de DATOS y no como un lenguaje de procedimientos. La
siguiente setencia (espero que corra porque no he podido probarla), debe


ser
de 100 a 1000 veces mas rapida que un cursor:
/* Inicio de Codigo Trigger */
UPDATE Pedidos
SET ServAlbaran=ServAlbaran-D.Pares
FROM Pedidos JOIN
(SELECT Pedido, Folio, SUM(Pares) as Pares
FROM Deleted
GROUP BY Pedido, Folio) AS D
ON Pedidos.Pedido=D.Pedido AND Pedidos.Folio=D.Folio
/* Fin de Codigo Trigger */
Me queda la duda de la razon para almacenar Pares como una columna de
Pedidos si podrias crear una vista de Pedidos con sus Pares? Algo como:
/* Inicio de Codigo Vista */
SELECT Col1, Col2, ..., SUM(Pares)
FROM Pedidos JOIN DetalleAlbaranes ON
ON Pedidos.Pedido=DetalleAlbaranes.Pedido
AND Pedidos.Folio=DetalleAlbaranes.Folio
GROUP BY Col1, Col2,
/* Inicio de Codigo Vista */

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

José Raúl Fenollar Martínez escribio:
> 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


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