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.
 

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.




Preguntas similares