Trigger que actualiza total Factura

10/07/2004 - 00:34 por Gabriel | Informe spam
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

Preguntas similare

Leer las respuestas

#1 MAXI
10/07/2004 - 02:18 | Informe spam
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:


"Gabriel" escribió en el mensaje
news:O%
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


Respuesta Responder a este mensaje
#2 Javier Loria
10/07/2004 - 17:46 | Informe spam
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 escribio:
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
Respuesta Responder a este mensaje
#3 Gabriel
11/07/2004 - 11:38 | Informe spam
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" escribió en el mensaje
news:
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 escribio:
> 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


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