Problema con Trigger

23/11/2006 - 00:14 por Ma. Rosario | Informe spam
Que tal a todos, estoy buscando ayuda respecto a cómo hacer funcionar el
siguiente trigger.

CREATE TRIGGER Precio_Promedio ON dbo.almacen_detalle_entrada
FOR INSERT,UPDATE
AS
Update almacen_catalogo_partes
Set precio_promedio=select (sum(inserted.importe)/sum(inserted.cantidad))
from almacen_detalle_entrada


Explico brevemento lo que quiero hacer, tengo una tabla llamada
"almacen_detalle_de_entrada" y dependiendo de los valores de esta tabla
me calcule el dato precio_promedio(es decir, la suma del campo cantidad
entre la suma del campo importe me debe de dar el dato
precio_promedio)el cual es el dato que tengo que actualizar en otra
tabla llamada almacen_catalogo_partes

A continuación muestro un ejemplo de mis tablas


"almacen_catalogo_partes"
id_parte, descripcion, existencia, precio_promedio,
1 XXX 1 7.5



"almacen_detalle_entrada"
id, id_entrada, id_parte, cantidad, precio_compra, importe
1 1 1 2 5 10
2 1 1 2 10 20


Entonces, como mencionaba anteriormente necesito que cada vez que se
agregue o actualice un dato en la tabla "almacen_detalle_entrada" me
calcule el precio promedio (ejemplo 30/2=7.5) y me actualice el campo
precio_promedio de la tabla "almacen_catalogo_partes"

Como se pudieron dar cuenta no tengo mucha experiencia manejando
triggers, es por esto que recurro a ustedes.

Espero y me puedan ayudar.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Maxi
23/11/2006 - 03:06 | Informe spam
Hola, te comento algo, las tablas inserted & deleted que estan dentro de los
triggers (tambien fuera con output en sql2005) contienen solamente la
informacion del conjunto a insertar, si lo que necetas es hacer un promedio
con los datos que ya estan mas los que se estan insertando entonces una
forma podria ser haciendo primero un union entre inserted y la tabla
principal y luego hacer el sum, por ej

Update almacen_catalogo_partes
Set precio_promedio= tabla.valor
from

(select id,sum(importe)/sum(cantidad) as valor from
(select id,inserted.importe,inserted.cantidad from inserted
union all
select id,almacen_detalle_entrada.importe,almacen_detalle_entrada.cantidad
from almacen_detalle_entrada) tx
group by id) tabla

inner join almacen_catalogo_partes on
almacen_catalogo_partes.id = tabla.id


PD: no probe el codigo con lo cual puede haber algun problema de sintaxis,
la idea es que veas el concepto y como encararlo


Saludos

[Microsoft MVP SQL Server]
www.sqlgurus.org
Buenos Aires - Argentina
"Ma. Rosario" wrote in message
news:
Que tal a todos, estoy buscando ayuda respecto a cómo hacer funcionar el
siguiente trigger.

CREATE TRIGGER Precio_Promedio ON dbo.almacen_detalle_entrada
FOR INSERT,UPDATE
AS
Update almacen_catalogo_partes
Set precio_promedio=select (sum(inserted.importe)/sum(inserted.cantidad))
from almacen_detalle_entrada


Explico brevemento lo que quiero hacer, tengo una tabla llamada
"almacen_detalle_de_entrada" y dependiendo de los valores de esta tabla me
calcule el dato precio_promedio(es decir, la suma del campo cantidad entre
la suma del campo importe me debe de dar el dato precio_promedio)el cual
es el dato que tengo que actualizar en otra tabla llamada
almacen_catalogo_partes

A continuación muestro un ejemplo de mis tablas


"almacen_catalogo_partes"
id_parte, descripcion, existencia, precio_promedio,
1 XXX 1 7.5



"almacen_detalle_entrada"
id, id_entrada, id_parte, cantidad, precio_compra, importe
1 1 1 2 5 10
2 1 1 2 10 20


Entonces, como mencionaba anteriormente necesito que cada vez que se
agregue o actualice un dato en la tabla "almacen_detalle_entrada" me
calcule el precio promedio (ejemplo 30/2=7.5) y me actualice el campo
precio_promedio de la tabla "almacen_catalogo_partes"

Como se pudieron dar cuenta no tengo mucha experiencia manejando triggers,
es por esto que recurro a ustedes.

Espero y me puedan ayudar.

Muchas gracias.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
23/11/2006 - 16:01 | Informe spam
Maxi,

El trigger se ejecuta dentro de la misma transaccion que inserta o actualiza
la tabla [almacen_detalle_entrada] y como es un trigger "after" entonces este
puede ver las filas que se insertaron en la tabla sin necesidad de hacer una
union con la tabla [inserted]. Si hacemos la union con [inserted] podriamos
estar contando esas filas dos veces.

Update
dbo.almacen_catalogo_partes
Set
precio_promedio = (
select
(sum(e.importe) / nullif(sum(e.cantidad), 0))
from
dbo.almacen_detalle_entrada as e
where
e.id_parte = dbo.almacen_catalogo_partes.id_parte
)
go

Creo que este calculo es bastante simple y posiblemente funcionaria bien una
vista indexada. No tengo un link que apunte a tu articulo sobre este tema,
crees que puedas postearlo por aca?


AMB

"Maxi" wrote:

Hola, te comento algo, las tablas inserted & deleted que estan dentro de los
triggers (tambien fuera con output en sql2005) contienen solamente la
informacion del conjunto a insertar, si lo que necetas es hacer un promedio
con los datos que ya estan mas los que se estan insertando entonces una
forma podria ser haciendo primero un union entre inserted y la tabla
principal y luego hacer el sum, por ej

Update almacen_catalogo_partes
Set precio_promedio= tabla.valor
from

(select id,sum(importe)/sum(cantidad) as valor from
(select id,inserted.importe,inserted.cantidad from inserted
union all
select id,almacen_detalle_entrada.importe,almacen_detalle_entrada.cantidad
from almacen_detalle_entrada) tx
group by id) tabla

inner join almacen_catalogo_partes on
almacen_catalogo_partes.id = tabla.id


PD: no probe el codigo con lo cual puede haber algun problema de sintaxis,
la idea es que veas el concepto y como encararlo


Saludos

[Microsoft MVP SQL Server]
www.sqlgurus.org
Buenos Aires - Argentina
"Ma. Rosario" wrote in message
news:
> Que tal a todos, estoy buscando ayuda respecto a cómo hacer funcionar el
> siguiente trigger.
>
> CREATE TRIGGER Precio_Promedio ON dbo.almacen_detalle_entrada
> FOR INSERT,UPDATE
> AS
> Update almacen_catalogo_partes
> Set precio_promedio=select (sum(inserted.importe)/sum(inserted.cantidad))
> from almacen_detalle_entrada
>
>
> Explico brevemento lo que quiero hacer, tengo una tabla llamada
> "almacen_detalle_de_entrada" y dependiendo de los valores de esta tabla me
> calcule el dato precio_promedio(es decir, la suma del campo cantidad entre
> la suma del campo importe me debe de dar el dato precio_promedio)el cual
> es el dato que tengo que actualizar en otra tabla llamada
> almacen_catalogo_partes
>
> A continuación muestro un ejemplo de mis tablas
>
>
> "almacen_catalogo_partes"
> id_parte, descripcion, existencia, precio_promedio,
> 1 XXX 1 7.5
>
>
>
> "almacen_detalle_entrada"
> id, id_entrada, id_parte, cantidad, precio_compra, importe
> 1 1 1 2 5 10
> 2 1 1 2 10 20
>
>
> Entonces, como mencionaba anteriormente necesito que cada vez que se
> agregue o actualice un dato en la tabla "almacen_detalle_entrada" me
> calcule el precio promedio (ejemplo 30/2=7.5) y me actualice el campo
> precio_promedio de la tabla "almacen_catalogo_partes"
>
> Como se pudieron dar cuenta no tengo mucha experiencia manejando triggers,
> es por esto que recurro a ustedes.
>
> Espero y me puedan ayudar.
>
> Muchas gracias.



Respuesta Responder a este mensaje
#3 Maxi
23/11/2006 - 17:07 | Informe spam
ops, tienes toda la razon :( pucha lo que es estar limado :( (no vi que era
after)

Es cierto que con una vista indexada se podria resolver y olvidar el trigger


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Alejandro Mesa" escribió en el
mensaje news:
Maxi,

El trigger se ejecuta dentro de la misma transaccion que inserta o
actualiza
la tabla [almacen_detalle_entrada] y como es un trigger "after" entonces
este
puede ver las filas que se insertaron en la tabla sin necesidad de hacer
una
union con la tabla [inserted]. Si hacemos la union con [inserted]
podriamos
estar contando esas filas dos veces.

Update
dbo.almacen_catalogo_partes
Set
precio_promedio = (
select
(sum(e.importe) / nullif(sum(e.cantidad), 0))
from
dbo.almacen_detalle_entrada as e
where
e.id_parte = dbo.almacen_catalogo_partes.id_parte
)
go

Creo que este calculo es bastante simple y posiblemente funcionaria bien
una
vista indexada. No tengo un link que apunte a tu articulo sobre este tema,
crees que puedas postearlo por aca?


AMB

"Maxi" wrote:

Hola, te comento algo, las tablas inserted & deleted que estan dentro de
los
triggers (tambien fuera con output en sql2005) contienen solamente la
informacion del conjunto a insertar, si lo que necetas es hacer un
promedio
con los datos que ya estan mas los que se estan insertando entonces una
forma podria ser haciendo primero un union entre inserted y la tabla
principal y luego hacer el sum, por ej

Update almacen_catalogo_partes
Set precio_promedio= tabla.valor
from

(select id,sum(importe)/sum(cantidad) as valor from
(select id,inserted.importe,inserted.cantidad from inserted
union all
select
id,almacen_detalle_entrada.importe,almacen_detalle_entrada.cantidad
from almacen_detalle_entrada) tx
group by id) tabla

inner join almacen_catalogo_partes on
almacen_catalogo_partes.id = tabla.id


PD: no probe el codigo con lo cual puede haber algun problema de
sintaxis,
la idea es que veas el concepto y como encararlo


Saludos

[Microsoft MVP SQL Server]
www.sqlgurus.org
Buenos Aires - Argentina
"Ma. Rosario" wrote in message
news:
> Que tal a todos, estoy buscando ayuda respecto a cómo hacer funcionar
> el
> siguiente trigger.
>
> CREATE TRIGGER Precio_Promedio ON dbo.almacen_detalle_entrada
> FOR INSERT,UPDATE
> AS
> Update almacen_catalogo_partes
> Set precio_promedio=select
> (sum(inserted.importe)/sum(inserted.cantidad))
> from almacen_detalle_entrada
>
>
> Explico brevemento lo que quiero hacer, tengo una tabla llamada
> "almacen_detalle_de_entrada" y dependiendo de los valores de esta tabla
> me
> calcule el dato precio_promedio(es decir, la suma del campo cantidad
> entre
> la suma del campo importe me debe de dar el dato precio_promedio)el
> cual
> es el dato que tengo que actualizar en otra tabla llamada
> almacen_catalogo_partes
>
> A continuación muestro un ejemplo de mis tablas
>
>
> "almacen_catalogo_partes"
> id_parte, descripcion, existencia, precio_promedio,
> 1 XXX 1 7.5
>
>
>
> "almacen_detalle_entrada"
> id, id_entrada, id_parte, cantidad, precio_compra, importe
> 1 1 1 2 5 10
> 2 1 1 2 10 20
>
>
> Entonces, como mencionaba anteriormente necesito que cada vez que se
> agregue o actualice un dato en la tabla "almacen_detalle_entrada" me
> calcule el precio promedio (ejemplo 30/2=7.5) y me actualice el campo
> precio_promedio de la tabla "almacen_catalogo_partes"
>
> Como se pudieron dar cuenta no tengo mucha experiencia manejando
> triggers,
> es por esto que recurro a ustedes.
>
> Espero y me puedan ayudar.
>
> Muchas gracias.



Respuesta Responder a este mensaje
#4 Ma. Rosario
23/11/2006 - 18:22 | Informe spam
Alejandro Mesa escribió:
Maxi,

El trigger se ejecuta dentro de la misma transaccion que inserta o actualiza
la tabla [almacen_detalle_entrada] y como es un trigger "after" entonces este
puede ver las filas que se insertaron en la tabla sin necesidad de hacer una
union con la tabla [inserted]. Si hacemos la union con [inserted] podriamos
estar contando esas filas dos veces.

Update
dbo.almacen_catalogo_partes
Set
precio_promedio = (
select
(sum(e.importe) / nullif(sum(e.cantidad), 0))
from
dbo.almacen_detalle_entrada as e
where
e.id_parte = dbo.almacen_catalogo_partes.id_parte
)
go

Creo que este calculo es bastante simple y posiblemente funcionaria bien una
vista indexada. No tengo un link que apunte a tu articulo sobre este tema,
crees que puedas postearlo por aca?


AMB

"Maxi" wrote:

Hola, te comento algo, las tablas inserted & deleted que estan dentro de los
triggers (tambien fuera con output en sql2005) contienen solamente la
informacion del conjunto a insertar, si lo que necetas es hacer un promedio
con los datos que ya estan mas los que se estan insertando entonces una
forma podria ser haciendo primero un union entre inserted y la tabla
principal y luego hacer el sum, por ej

Update almacen_catalogo_partes
Set precio_promedio= tabla.valor
from

(select id,sum(importe)/sum(cantidad) as valor from
(select id,inserted.importe,inserted.cantidad from inserted
union all
select id,almacen_detalle_entrada.importe,almacen_detalle_entrada.cantidad
from almacen_detalle_entrada) tx
group by id) tabla

inner join almacen_catalogo_partes on
almacen_catalogo_partes.id = tabla.id


PD: no probe el codigo con lo cual puede haber algun problema de sintaxis,
la idea es que veas el concepto y como encararlo


Saludos

[Microsoft MVP SQL Server]
www.sqlgurus.org
Buenos Aires - Argentina
"Ma. Rosario" wrote in message
news:
Que tal a todos, estoy buscando ayuda respecto a cómo hacer funcionar el
siguiente trigger.

CREATE TRIGGER Precio_Promedio ON dbo.almacen_detalle_entrada
FOR INSERT,UPDATE
AS
Update almacen_catalogo_partes
Set precio_promedio=select (sum(inserted.importe)/sum(inserted.cantidad))
from almacen_detalle_entrada


Explico brevemento lo que quiero hacer, tengo una tabla llamada
"almacen_detalle_de_entrada" y dependiendo de los valores de esta tabla me
calcule el dato precio_promedio(es decir, la suma del campo cantidad entre
la suma del campo importe me debe de dar el dato precio_promedio)el cual
es el dato que tengo que actualizar en otra tabla llamada
almacen_catalogo_partes

A continuación muestro un ejemplo de mis tablas


"almacen_catalogo_partes"
id_parte, descripcion, existencia, precio_promedio,
1 XXX 1 7.5



"almacen_detalle_entrada"
id, id_entrada, id_parte, cantidad, precio_compra, importe
1 1 1 2 5 10
2 1 1 2 10 20


Entonces, como mencionaba anteriormente necesito que cada vez que se
agregue o actualice un dato en la tabla "almacen_detalle_entrada" me
calcule el precio promedio (ejemplo 30/2=7.5) y me actualice el campo
precio_promedio de la tabla "almacen_catalogo_partes"

Como se pudieron dar cuenta no tengo mucha experiencia manejando triggers,
es por esto que recurro a ustedes.

Espero y me puedan ayudar.

Muchas gracias.









Muchas gracias a los dos, me han ayudado mucho, me fué de mucha utilidad
lo que me contestaron.

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