Actualizar Master-Detail

19/10/2006 - 14:03 por Jaime Lloret | Informe spam
Tengo dos tablas master-detail de forma que la primera contiene el total de
las lineas del detalle. Con la siguiente estructura :
Tabla Entregas : Cod, Total

Tabla Detalle : Cod, CodEntrega, TotalDetalle

De forma que cuando actualizo en la tabla detalle me actualice la cabecera.
tengo puesto el siguiente código en el desencadenado AFTER UPDATE



UPDATE Entregas SET Total = Total +

( SELECT SUM( Inserted.TotalDetalle) FROM Inserted INNER JOIN Entregas ON
Inserted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Inserted.CodEntrega ) -

( SELECT SUM(Deleted.Total) FROM Deleted INNER JOIN Entregas ON
Deleted.CodEntrega = Entregas.Cod WHERE Entregas.Cod = Deleted.CodEntrega )

WHERE Entregas.Cod IN (SELECT CodEntrega FROM inserted)

Funciona Correctamente cuando hago modificaciones del detalle una a una. Y
funciona mal cuando hago por ejemplo modificaciones masivas de líneas de
detalle.

Por ejemplo si sumo a todas la línea 100 y tengo 5 líneas, todas las
cabeceras se incrementas en 500


Un saludo y Gracias de Antemano


Jaime Lloret.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristán
19/10/2006 - 14:21 | Informe spam
Prueba con

***************************************************

UPDATE Entregas SET Total = Total + i.totalDetalle - d.totalDetalle
FROM entregas INNER JOIN
( SELECT SUM( Inserted.TotalDetalle) totalDetalle, codEntrega FROM Inserted
GROUP BY codEntrega) AS i ON entregas.cod=i.codEntrega INNER JOIN ( SELECT
SUM( Deleted.TotalDetalle) totalDetalle, codEntrega FROM Deleted GROUP BY
codEntrega) AS d ON entregas.cod=d.codEntrega

***************************************************

De todos modos, te recomendaría que estas operaciones las realizaras
dentro de un procedimiento almacenado. Creo que los triggers, excepto en
casos muy puntuales, lo que consiguen es complicar la lógica de negocio.

Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Jaime Lloret" escribió en el mensaje
news:Oo9%
Tengo dos tablas master-detail de forma que la primera contiene el total
de las lineas del detalle. Con la siguiente estructura :
Tabla Entregas : Cod, Total

Tabla Detalle : Cod, CodEntrega, TotalDetalle

De forma que cuando actualizo en la tabla detalle me actualice la
cabecera. tengo puesto el siguiente código en el desencadenado AFTER
UPDATE



UPDATE Entregas SET Total = Total +

( SELECT SUM( Inserted.TotalDetalle) FROM Inserted INNER JOIN Entregas ON
Inserted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Inserted.CodEntrega ) -

( SELECT SUM(Deleted.Total) FROM Deleted INNER JOIN Entregas ON
Deleted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Deleted.CodEntrega )

WHERE Entregas.Cod IN (SELECT CodEntrega FROM inserted)

Funciona Correctamente cuando hago modificaciones del detalle una a una. Y
funciona mal cuando hago por ejemplo modificaciones masivas de líneas de
detalle.

Por ejemplo si sumo a todas la línea 100 y tengo 5 líneas, todas las
cabeceras se incrementas en 500


Un saludo y Gracias de Antemano


Jaime Lloret.




Respuesta Responder a este mensaje
#2 Javier Loria
19/10/2006 - 14:29 | Informe spam
Hola Jaime:
Prueba con el siguiente codigo:
=UPDATE Entregas
SET Total=Total+Insertados.Total-Borrados.Total
FROM Entregas
JOIN (SELECT Cod, SUM(Inserted.TotalDetalle)
FROM Inserted
GROUP BY Cod) AS Insertados
ON Entregas.Cod=Insertados.Cod
JOIN JOIN (SELECT Cod, SUM(Deleted.TotalDetalle)
FROM Deleted
GROUP BY Cod) AS Borrados
ON Entregas.Cod=Borrados.Cod
= Saludos,


Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Jaime Lloret" wrote in message
news:Oo9%
Tengo dos tablas master-detail de forma que la primera contiene el total
de las lineas del detalle. Con la siguiente estructura :
Tabla Entregas : Cod, Total

Tabla Detalle : Cod, CodEntrega, TotalDetalle

De forma que cuando actualizo en la tabla detalle me actualice la
cabecera. tengo puesto el siguiente código en el desencadenado AFTER
UPDATE



UPDATE Entregas SET Total = Total +

( SELECT SUM( Inserted.TotalDetalle) FROM Inserted INNER JOIN Entregas ON
Inserted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Inserted.CodEntrega ) -

( SELECT SUM(Deleted.Total) FROM Deleted INNER JOIN Entregas ON
Deleted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Deleted.CodEntrega )

WHERE Entregas.Cod IN (SELECT CodEntrega FROM inserted)

Funciona Correctamente cuando hago modificaciones del detalle una a una. Y
funciona mal cuando hago por ejemplo modificaciones masivas de líneas de
detalle.

Por ejemplo si sumo a todas la línea 100 y tengo 5 líneas, todas las
cabeceras se incrementas en 500


Un saludo y Gracias de Antemano


Jaime Lloret.




Respuesta Responder a este mensaje
#3 Maxi
19/10/2006 - 14:42 | Informe spam
Hola, yo en este caso recomiendo sacar el trigger y no poner esto en un SP
:-p, yo en este tipo de cosas uso vistas indexadas y la verdad que son mucho
mas faciles de mantener y a la larga mas optimas

pongo un link con ejemplos que di en algunas charlas:

http://www.mug.org.ar/Descargas/Jor...le.aspx?id59

http://www.microsoft.com/spanish/ms...gosto.aspx


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:
Prueba con

***************************************************

UPDATE Entregas SET Total = Total + i.totalDetalle - d.totalDetalle
FROM entregas INNER JOIN
( SELECT SUM( Inserted.TotalDetalle) totalDetalle, codEntrega FROM
Inserted GROUP BY codEntrega) AS i ON entregas.cod=i.codEntrega INNER
JOIN ( SELECT SUM( Deleted.TotalDetalle) totalDetalle, codEntrega FROM
Deleted GROUP BY codEntrega) AS d ON entregas.cod=d.codEntrega

***************************************************

De todos modos, te recomendaría que estas operaciones las realizaras
dentro de un procedimiento almacenado. Creo que los triggers, excepto en
casos muy puntuales, lo que consiguen es complicar la lógica de negocio.

Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Jaime Lloret" escribió en el mensaje
news:Oo9%
Tengo dos tablas master-detail de forma que la primera contiene el total
de las lineas del detalle. Con la siguiente estructura :
Tabla Entregas : Cod, Total

Tabla Detalle : Cod, CodEntrega, TotalDetalle

De forma que cuando actualizo en la tabla detalle me actualice la
cabecera. tengo puesto el siguiente código en el desencadenado AFTER
UPDATE



UPDATE Entregas SET Total = Total +

( SELECT SUM( Inserted.TotalDetalle) FROM Inserted INNER JOIN Entregas ON
Inserted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Inserted.CodEntrega ) -

( SELECT SUM(Deleted.Total) FROM Deleted INNER JOIN Entregas ON
Deleted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Deleted.CodEntrega )

WHERE Entregas.Cod IN (SELECT CodEntrega FROM inserted)

Funciona Correctamente cuando hago modificaciones del detalle una a una.
Y funciona mal cuando hago por ejemplo modificaciones masivas de líneas
de detalle.

Por ejemplo si sumo a todas la línea 100 y tengo 5 líneas, todas las
cabeceras se incrementas en 500


Un saludo y Gracias de Antemano


Jaime Lloret.








Respuesta Responder a este mensaje
#4 Javier Loria
19/10/2006 - 15:10 | Informe spam
Hola Jaime:
Un error en mi codigo es que usa INNER JOIN y si es un trigger de UPDATE
funciona bien, pero si es un INSERT o DELETE no funciona, prueba con:
=UPDATE Entregas
SET Total=Total+COALESCE(Insertados.Total,0)-COALESCE(Borrados.Total,0)
FROM Entregas
LEFT JOIN (SELECT Cod, SUM(Inserted.TotalDetalle)
FROM Inserted
GROUP BY Cod) AS Insertados
ON Entregas.Cod=Insertados.Cod
LEFT JOIN JOIN (SELECT Cod, SUM(Deleted.TotalDetalle)
FROM Deleted
GROUP BY Cod) AS Borrados
ON Entregas.Cod=Borrados.Cod


Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Javier Loria" wrote in message
news:
Hola Jaime:
Prueba con el siguiente codigo:
=> UPDATE Entregas
SET Total=Total+Insertados.Total-Borrados.Total
FROM Entregas
JOIN (SELECT Cod, SUM(Inserted.TotalDetalle)
FROM Inserted
GROUP BY Cod) AS Insertados
ON Entregas.Cod=Insertados.Cod
JOIN JOIN (SELECT Cod, SUM(Deleted.TotalDetalle)
FROM Deleted
GROUP BY Cod) AS Borrados
ON Entregas.Cod=Borrados.Cod
=> Saludos,


Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Jaime Lloret" wrote in message
news:Oo9%
Tengo dos tablas master-detail de forma que la primera contiene el total
de las lineas del detalle. Con la siguiente estructura :
Tabla Entregas : Cod, Total

Tabla Detalle : Cod, CodEntrega, TotalDetalle

De forma que cuando actualizo en la tabla detalle me actualice la
cabecera. tengo puesto el siguiente código en el desencadenado AFTER
UPDATE



UPDATE Entregas SET Total = Total +

( SELECT SUM( Inserted.TotalDetalle) FROM Inserted INNER JOIN Entregas ON
Inserted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Inserted.CodEntrega ) -

( SELECT SUM(Deleted.Total) FROM Deleted INNER JOIN Entregas ON
Deleted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
Deleted.CodEntrega )

WHERE Entregas.Cod IN (SELECT CodEntrega FROM inserted)

Funciona Correctamente cuando hago modificaciones del detalle una a una.
Y funciona mal cuando hago por ejemplo modificaciones masivas de líneas
de detalle.

Por ejemplo si sumo a todas la línea 100 y tengo 5 líneas, todas las
cabeceras se incrementas en 500


Un saludo y Gracias de Antemano


Jaime Lloret.








Respuesta Responder a este mensaje
#5 Alejandro Mesa
19/10/2006 - 15:55 | Informe spam
Maxi,

No siempre se pueden usar vistas indexadas para resolver este tipo de
requerimientos. Por ejemplo, si quiero tener una columna con el total de
ordenes por cliente, pero quiero ver tambien los clientes que no tienen
ordenes (en mi caso se puede dar de alta a un cliente sin que este tenga una
orden), entonces tuviera que usar un LEFT OUTER JOIN entre [cliente] y
[orden] o quizas un subquery para contar las ordenes, pero las vistas
indexadas no permiten "outer join", ni subqueries. Tambien se debe tener en
cuenta el numero de transacciones, pues si este volumen es alto, SQL Server
consumira muchos recursos actualizando la vista indexada. No existe una unica
solucion, o un traje que le sirva a todos, se deben analizar los pros y
contras y seleccionar la solucion que mejor se acomode a las necesidades.

Con esto no quiero decir que las vistas indexadas no son utiles, no me mal
interpreten.Estas son muy utiles cuando se adaptan a las necesidades o
requeriminetos.


AMB

"Maxi" wrote:

Hola, yo en este caso recomiendo sacar el trigger y no poner esto en un SP
:-p, yo en este tipo de cosas uso vistas indexadas y la verdad que son mucho
mas faciles de mantener y a la larga mas optimas

pongo un link con ejemplos que di en algunas charlas:

http://www.mug.org.ar/Descargas/Jor...le.aspx?id59

http://www.microsoft.com/spanish/ms...gosto.aspx


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:
> Prueba con
>
> ***************************************************
>
> UPDATE Entregas SET Total = Total + i.totalDetalle - d.totalDetalle
> FROM entregas INNER JOIN
> ( SELECT SUM( Inserted.TotalDetalle) totalDetalle, codEntrega FROM
> Inserted GROUP BY codEntrega) AS i ON entregas.cod=i.codEntrega INNER
> JOIN ( SELECT SUM( Deleted.TotalDetalle) totalDetalle, codEntrega FROM
> Deleted GROUP BY codEntrega) AS d ON entregas.cod=d.codEntrega
>
> ***************************************************
>
> De todos modos, te recomendaría que estas operaciones las realizaras
> dentro de un procedimiento almacenado. Creo que los triggers, excepto en
> casos muy puntuales, lo que consiguen es complicar la lógica de negocio.
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> "Jaime Lloret" escribió en el mensaje
> news:Oo9%
>> Tengo dos tablas master-detail de forma que la primera contiene el total
>> de las lineas del detalle. Con la siguiente estructura :
>> Tabla Entregas : Cod, Total
>>
>> Tabla Detalle : Cod, CodEntrega, TotalDetalle
>>
>> De forma que cuando actualizo en la tabla detalle me actualice la
>> cabecera. tengo puesto el siguiente código en el desencadenado AFTER
>> UPDATE
>>
>>
>>
>> UPDATE Entregas SET Total = Total +
>>
>> ( SELECT SUM( Inserted.TotalDetalle) FROM Inserted INNER JOIN Entregas ON
>> Inserted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
>> Inserted.CodEntrega ) -
>>
>> ( SELECT SUM(Deleted.Total) FROM Deleted INNER JOIN Entregas ON
>> Deleted.CodEntrega = Entregas.Cod WHERE Entregas.Cod =
>> Deleted.CodEntrega )
>>
>> WHERE Entregas.Cod IN (SELECT CodEntrega FROM inserted)
>>
>> Funciona Correctamente cuando hago modificaciones del detalle una a una.
>> Y funciona mal cuando hago por ejemplo modificaciones masivas de líneas
>> de detalle.
>>
>> Por ejemplo si sumo a todas la línea 100 y tengo 5 líneas, todas las
>> cabeceras se incrementas en 500
>>
>>
>> Un saludo y Gracias de Antemano
>>
>>
>> Jaime Lloret.
>>
>>
>>
>>
>
>



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