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

#6 Maxi
19/10/2006 - 16:13 | Informe spam
Claro es como todo, hay q analizar bien las alternativas, ninguna es
perfecta, todas tienen sus pros & contras con lo cual hay q poner en la
balanza y ver cual elegir


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Alejandro Mesa" escribió en el
mensaje news:
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
#7 Jaime Lloret
19/10/2006 - 17:04 | Informe spam
Gracias a Todos por sus respuestas, pero he intentado la de Javier y me dice
los siguientes errores ..



Mens 156, Nivel 15, Estado 1, Procedimiento EntregasDetalle_U, Línea 60

Sintaxis incorrecta cerca de la palabra clave 'JOIN'.

Mens 156, Nivel 15, Estado 1, Procedimiento EntregasDetalle_U, Línea 62

Sintaxis incorrecta cerca de la palabra clave 'AS'.



"Javier Loria" escribió en el mensaje
news:

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
#8 Jaime Lloret
19/10/2006 - 17:54 | Informe spam
Gracias Javier, ya lo tengo solucionado...

"Javier Loria" escribió en el mensaje
news:
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.













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