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

Preguntas similare

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

Respuesta Responder a este mensaje
#2 Eduardo Castro
16/07/2007 - 18:58 | Informe spam
En este caso tal y como lo indica Ricardo lo mejor es crear una vista
indexada.

Saludos,

Eduardo Castro - MVP
http://ecastrom.blogspot.com


"Ricardo Passians" wrote in message
news:

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





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