Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Es necesario usar un cursor en este caso

Estas en el tema de Es necesario usar un cursor en este caso en el foro de SQL Server en Foros del Web. Buenos Dias Foristas Tengo el sg problema veran debo actualizar el Stock_Actual de mi almacen en base Al Stock inicial + el Total de compra ...
  #1 (permalink)  
Antiguo 05/11/2007, 09:39
 
Fecha de Ingreso: noviembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Pregunta Es necesario usar un cursor en este caso

Buenos Dias Foristas

Tengo el sg problema
veran debo actualizar el Stock_Actual de mi almacen
en base Al Stock inicial + el Total de compra - Total Ventas - Total Traslados - .. Bajas
por las pruebas q he hecho esto no se puede realizar masivamente
pues no se pueden poner sum en medio de
senetncias Updates
creo q la unica forma es usando un cursor y actualizar el stock actual producto por
por producto

Ojo tengo un campo para guardar el stock de cada almacen
aqui no estoy diferenciando los almacenes , primero quiero saber si se puede realizar con
una sola sentencia update
Desya ya les doy las gracias por la ayuda q me puedan dar
Saludos a todos

--Actualmente tengo unos 4000 productos , pero en unos meses agregare unos miles mas
Aqui mi scrip

Update Productos
set StockActual_Alm1 =
StockInicial_Alm1 +
(sum (isnull (CD.Cantidad ,0) * isnull (CD.Equivalente,0)))
-
(sum (isnull (VD.Cantidad ,0) * isnull (CD.Equivalente,0)))

From

Productos
left join VentasDetalle VD
on Productos.CodProducto = VD.CodProducto
left join ComprasDetalle CD
on Productos.CodProducto = CD.CodProducto


group by Productos.CodProducto

Última edición por jfrank; 05/11/2007 a las 09:59 Razón: Agregar algo mas
  #2 (permalink)  
Antiguo 05/11/2007, 10:34
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Es necesario usar un cursor en este caso

Código:
Update Productos
set    StockActual_Alm1 = StockInicial_Alm1 + R.Result
From   Productos  P
Inner join
      (Select  Productos.CodProducto
              ,(sum (isnull (CD.Cantidad ,0) * isnull (CD.Equivalente,0)))  - 
               (sum (isnull (VD.Cantidad ,0) * isnull (CD.Equivalente,0)))  AS Result
      From Productos 
      left join 
           VentasDetalle VD 
      on   Productos.CodProducto = VD.CodProducto
      left join 
           ComprasDetalle CD 
      on   Productos.CodProducto = CD.CodProducto
      Group by 
           Productos.CodProducto) R
On   P.CodProducto = R.CodProducto
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 05/11/2007, 14:50
 
Fecha de Ingreso: noviembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Es necesario usar un cursor en este caso

Gracias Andres , funciona de maravilla
ahora le hey agregado una sentencia mas para q solo
sume cantidad * equivalente cuando el Codigo de Almacen es A_001

Update Productos
set StockActual_Alm1 = StockInicial_Alm1 + R.Result
From Productos P
Inner join
(Select Productos.CodProducto
,(sum (isnull (CD.Cantidad ,0) * isnull (CD.Equivalente,0))) -
(sum (isnull (VD.Cantidad ,0) * isnull (CD.Equivalente,0))) AS Result
From Productos
left join
VentasDetalle VD
on Productos.CodProducto = VD.CodProducto
left join
ComprasDetalle CD
on Productos.CodProducto = CD.CodProducto ,
Ventas V , Compras C

where V.CodVenta = VD.CodVenta and V.Cod_Almacen = 'A_001'
AND
C.CodCompra = CD.CodCompra and C.Cod_Almacen = 'A_001'
Group by
Productos.CodProducto) R
On P.CodProducto = R.CodProducto

Pero solo esta afectando a 5 registros (q son los q estan en el detalle de ventas y compras )y no todos ,
donde debe estar la condicion where V.CodVenta = VD.CodVenta and V.Cod_Almacen = 'A_0001' and C.Codcompra ......
para q siga actualizando a todos los articulos

Última edición por jfrank; 05/11/2007 a las 15:27
  #4 (permalink)  
Antiguo 05/11/2007, 15:57
 
Fecha de Ingreso: noviembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Es necesario usar un cursor en este caso

ya ahora si quedo bien , solo era cuestion de modificar los joins
Saludos ,y gracias por tu ayuda

Update Productos
set StockActual_Alm1 = StockInicial_Alm1 + R.Result
From Productos P
Inner join
(Select Productos.CodProducto
,(sum (isnull (CD.Cantidad ,0) * isnull (CD.Equivalente,0))) -
(sum (isnull (VD.Cantidad ,0) * isnull (CD.Equivalente,0))) AS Result
From Productos
left join

(select CodArticulo , Cantidad ,Equivalente from ventasdetalle ,ventas
where Ventas.Cod_Almacen = 'A_001'and Ventas.CodVenta = VentasDetalle.Codventa) VD
on Productos.CodProducto = VD.CodProducto
left join
(select CodArticulo , Cantidad ,Equivalente from Comprasdetalle ,Compras
where Compras.Cod_Almacen = 'A_001' and Compras.CodCompra = ComprasDetalle.Codcompra) CD


on Productos.CodProducto = CD.CodProducto ,


On P.CodProducto = R.CodProducto
  #5 (permalink)  
Antiguo 07/11/2007, 13:56
 
Fecha de Ingreso: noviembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Es necesario usar un cursor en este caso

Solo una cosa mas ,la sentencia estaba distorcionando los resultados
debido a q los left join VentasDetalle
left join ComprasDetalle , "internamente" estaban selecionando y sumando mas registros de lo q yo esperaba

y tuve q hacer un join para cada tabla

Código:
 

From Productos 
Left Join (select ..Ventas ,VentasDetalle  
       grop by VentasDetalle.Codarticulos) Vd
       on P.CodProducto = vd.codproducto
Left Join (......) Cd
       on .........
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:05.