Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Trigger que actualiza total Factura

1,707 views
Skip to first unread message

Gabriel

unread,
Jul 9, 2004, 6:34:50 PM7/9/04
to
Hola
hasta ahora estaba trabajando en Interbase / Firebird y para actualizar el
total de la factura , al modificar los pedidos, disparaba los triggers en
Update , Detete e Inserted

Mas o menos Esto

CREATE TRIGGER ELIMINADETALLFACTURA FOR FACTURESDETALL ACTIVE
AFTER DELETE POSITION 1
as
begin
execute procedure RecalculaFactura old.Num_Factura;
end


CREATE PROCEDURE RECALCULAFACTURA (
NUMFAC INTEGER)
AS
declare variable SubTotal float;
begin
select sum(Unitats * PreuUnitat)
from FacturesDetall
where Num_Factura = :NumFac
into SubTotal;
if(SubTotal is null) Then SubTotal = 0;
update Factures
set SubTotal = :SubTotal
where Num_Factura = :NumFac;
end


Ahora intento provar cosas en SQLServer y me hago un poco de lio con las
Tablas Inseted y Deleted

Alguien me puede echar un Trigger en SQLServer que me mantenga actualizada
la Factura al Modificar , insertar o eliminar cualquier detalle.

Gracias


MAXI

unread,
Jul 9, 2004, 8:18:29 PM7/9/04
to
hola, fijate unos hilos mas abajo "Actualizacion de Stock en 2 tablas" a ver
si te es util

Un abrazo

--

---------------------------------------------------------

Maxi

Buenos Aires - Argentina

Desarrollador .NET 3 Estrellas

Mail: Maxi_accotto[arroba]speedy.com.ar

MSN: Maxi_a...@msn.com

---------------------------------------------------
"Gabriel" <gabr...@telefonica.net> escribió en el mensaje
news:O%231AAUgZ...@tk2msftngp13.phx.gbl...

Javier Loria

unread,
Jul 10, 2004, 11:46:09 AM7/10/04
to
Hola:
Un trigger que actualice el Total de Factura.
======================
UPDATE Factures
SET Total=SumDetalle.Total
FROM Factures
JOIN (SELECT Num_Factura
, SUM(Unitats*PreuUnitat) AS Total
FROM FaturesDetall
GROUP BY Num_Factura) AS SumDetalle
ON Factures.Num_Factura=SumDetalle.Num_Factura
JOIN (SELECT Num_Factura FROM Inserted
UNION
SELECT Num_Factura FROM Deleted) AS Modificados
ON Factures.Num_Factura=Modificados.Num_Factura
=======================
Si lo analizas de arriba hacia abajo:
a) El ultimo JOIN, es un UNION de Inserted y Deleted, lo que significa
que cualquier factura modificada va a ser recalculada. El Union garantiza
que las filas repetidas se eliminan.
b) El segundo JOIN totaliza el detalle por facturas, agrupandolos por
numero.
c) En general es mejor recalcular todo, que entrar en la logica de reste
el anterior y sume el nuevo.
Por ultimo lo recomendable es que reconsideres si quieres guardar el
total de factura o no. Con frecuencia es mas rapido calcular el total en el
momento en que lo solicitan y no retrazar el proceso de
insercion/modificacion/borrado. Una vista suele ser mucho mas eficiente
=====================
CREATE VIEW FacturesTotal
AS
SELECT Factures.Num_Factura
, ....
,SUM(FactureDetalle)
FROM Factures
JOIN FacturesDetall
ON Factures.Num_Factura=FaturesDetall.Num_Factura
GROUP BY Factures.Num_Factura, ....
=====================
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.

Gabriel <gabr...@telefonica.net> escribio:

Gabriel

unread,
Jul 11, 2004, 5:38:55 AM7/11/04
to
Muchisimas Gracias

Con lo que me pasas tengo bastante material para estudiarme bien la logica
de SQLServer.
Por cierto jo tambien soy de la opinion que es mejor recalcular tota la
factura, al modificar algun detalle, por lo de asegurar la jugada al maximo.
tambien me pensare lo de calcular el campo solo cuando sea necesario.

Gracias
Gabriel

"Javier Loria" <nos...@nospam.com> escribió en el mensaje
news:uuhwLUp...@TK2MSFTNGP12.phx.gbl...

0 new messages