Update como optimizar?

13/07/2007 - 19:12 por jmauriciopb | Informe spam
Hola,

Tengo las siguientes tablas.

Inv_Item
iItemId int, nCosto Numerico, cDescripcion Caracter

Inv_ItemStock
iItemStockId I, iIdBodega, iIdItem I, nCantidad Numerico

cuando hago un ingreso necesito hacer un recosteo, el problema se da
por que el costo es unico por Item y la cantidad esta dividada en los
diferentes bodegas en la tabla Inv_itemStock.

al momento se me ocurre hacer el siguiente Update por linea ingresada
en el movimiento:

Update Inv_Item Set nCosto = (ROUND(nCosto * (Select Sum(nCantidad)

From Inv_ItemStock Where Inv_ItemStock.iIdItem = 20211), 2) + Costo


total por linea) / ((Select Sum(nCantidad) From Inv_ItemStock Where
Inv_ItemStock.iIdItem = 20211) + Cantidad por linea)Where
Inv_Item.iItemId = 20211

Esto lo ejecuto mediante ado desde el cliente.


Otra solucion seria crear un descadenate para Inv_itemStock.nCantidad
para que cada vez que se actualice (sume o reste segun el caso) se
actualiza el campo Inv_item.nCantidad.

Me parace mas optimo este opcion ya que el update seria asi:

Update Inv_Item Set nCosto = (ROUND(nCosto * nCantidad), 2) + Costo
total por linea) / (nCantidad + Cantidad por linea) Where
Inv_Item.iItemId = 20211

La idea esta dada, pero mis conocimientos son escaso con Sql Server no
se como implementarla, espero que me puedan ayudar con la solucion mas
optima a este problema.

Sql Server 2000, Ado 2.8 + VFP 8.0

Saludos,
Mauricio Pulla.
Cuenca Ecuador
 

Leer las respuestas

#1 Ricardo Passians
13/07/2007 - 23:34 | Informe spam
Podrías mejor quizás tratar el costo (promedio ponderado según lo que
explicas) como un cociente. Es decir dividirlo en dos campos, el numerador
y el denominador. El numerador acumularía el total de valores ingresados,
el denominador acumularía el total de cantidades ingresadas. Luego el costo
podrías definirlo como un campo calculado que divida esos dos. Así el
cálculo sería más preciso y manejable.

Puedes hacer un trigger, si te gustan :), que vaya manteniendo ambos campos
a medida que ingresen (o se egresen) cantidades al stock. O, quizás mejor
para este caso, diseñar una una vista indexada.


Ojalá te sirva.

Saludos

Ricardo Passians


escribió en el mensaje
news:
Hola,

Tengo las siguientes tablas.

Inv_Item
iItemId int, nCosto Numerico, cDescripcion Caracter

Inv_ItemStock
iItemStockId I, iIdBodega, iIdItem I, nCantidad Numerico

cuando hago un ingreso necesito hacer un recosteo, el problema se da
por que el costo es unico por Item y la cantidad esta dividada en los
diferentes bodegas en la tabla Inv_itemStock.

al momento se me ocurre hacer el siguiente Update por linea ingresada
en el movimiento:

Update Inv_Item Set nCosto = (ROUND(nCosto * (Select Sum(nCantidad)
From Inv_ItemStock Where Inv_ItemStock.iIdItem = 20211), 2) + Costo


total por linea) / ((Select Sum(nCantidad) From Inv_ItemStock Where
Inv_ItemStock.iIdItem = 20211) + Cantidad por linea)Where
Inv_Item.iItemId = 20211

Esto lo ejecuto mediante ado desde el cliente.


Otra solucion seria crear un descadenate para Inv_itemStock.nCantidad
para que cada vez que se actualice (sume o reste segun el caso) se
actualiza el campo Inv_item.nCantidad.

Me parace mas optimo este opcion ya que el update seria asi:

Update Inv_Item Set nCosto = (ROUND(nCosto * nCantidad), 2) + Costo
total por linea) / (nCantidad + Cantidad por linea) Where
Inv_Item.iItemId = 20211

La idea esta dada, pero mis conocimientos son escaso con Sql Server no
se como implementarla, espero que me puedan ayudar con la solucion mas
optima a este problema.

Sql Server 2000, Ado 2.8 + VFP 8.0

Saludos,
Mauricio Pulla.
Cuenca Ecuador

Preguntas similares