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

Cálculo de Stock con 2 tablas y procedimiento almacenado.

Estas en el tema de Cálculo de Stock con 2 tablas y procedimiento almacenado. en el foro de SQL Server en Foros del Web. Hola, Busqué en el foro antes de realizar esta consulta y no encontré algo parecido a mi caso. Estoy aprendiendo Visual Basic.Net y SQL Server, ...
  #1 (permalink)  
Antiguo 25/06/2014, 23:17
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Cálculo de Stock con 2 tablas y procedimiento almacenado.

Hola,

Busqué en el foro antes de realizar esta consulta y no encontré algo parecido a mi caso.
Estoy aprendiendo Visual Basic.Net y SQL Server, y estoy tratando de calcular el stock, sin embargo, el cálculo me sale bien cuando ingreso 1 documento en entrada de productos y 1 en salida de productos (o consumo).

El tema es cuando agrego otra guía...allí empieza el problema.

Favor, ingresar a este link donde aparece una imagen donde explica el caso a detalle. (Click en la imagen para agrandarla)

=> http://www.geoservices-petro.com/Consulta_Foro.jpg

Agradezco su ayuda de antemano.

Saludos.
  #2 (permalink)  
Antiguo 26/06/2014, 07:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Puedes poner un ejemplo de tus datos? ya que no puedo ver la imagenque pusiste....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 26/06/2014, 08:32
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

A ver, intentaré colocar las imágenes por aquí.











Ojalá se vean las imágenes.
  #4 (permalink)  
Antiguo 26/06/2014, 08:42
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

A ver una pregunta segun tu que es "stock"? lo estas tomando como el total en peso de tu producto???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 26/06/2014, 09:00
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Stock es el resultado de la resta de (Peso_Especifico_GR - Consumo)
Sucede que aquí se trabaja con peso específico (ignoremos el GR) porque se trabaja en totales de litros y gramos de un producto.

Sucede que 1 envase por ejemplo, puede tener 5 litros...y como se maneja a granel, hay que transformar a totales.

¿Algo más claro?
  #6 (permalink)  
Antiguo 26/06/2014, 10:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

porque no haces primero la suma de las entradas, y la suma de las dalidas y dspues haces la resta? por eso no te sale cuando tienes mas de uno, otra cosa ya tienes un group by ya no necesitas el distinct, quedaria algo como esto:

Código SQL:
Ver original
  1. SELECT id_producto,descripcion, t_peso-t_consumo AS stock, unidad FROM
  2. (
  3. SELECT id_producto, descripcion, SUM(peso) AS t_peso, SUM(consumo) AS t_consumo,unidad FROM tabla
  4. GROUP BY id_producto,descripcion,unidad
  5. ) AS t1 GROUP BY id_producto,descripcion,unidad

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 26/06/2014, 10:44
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Gracias por la rápida respuesta, voy a probarlo ahora y te comento.
  #8 (permalink)  
Antiguo 26/06/2014, 13:33
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Cita:
Iniciado por surrealista Ver Mensaje
Gracias por la rápida respuesta, voy a probarlo ahora y te comento.
Al parecer esa era la solucion porque ya no se vio otro post.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 26/06/2014, 13:40
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Lo que pasa es que...jeje, no soy muy bueno en sql y estoy viendo en google como hacer subconsultas para adecuarlo a lo que me enviaste, pero aún no me sale...
  #10 (permalink)  
Antiguo 26/06/2014, 13:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Código SQL:
Ver original
  1. ALTER proc sp_consultar_stock_por_almacen @idalmacen NCHAR(2)
  2. AS
  3. BEGIN
  4.     SELECT idproducto,descripcion,(t_peso-t_consumo) AS stock, unidad FROM(
  5.     SELECT di.idproducto,p.descripcion,SUM(di.peso_especifico_gr) AS t_peso, SUM(dsi.consumo) AS t_consumo, di.unidad FROM detalleinventario di
  6.     INNER joi producto p ON (p.idproducto=di.idproducto)
  7.     LEFT JOIN detallesalidainventario dsi ON (di.idproducto=dsi.idproducto)
  8.     INNER JOIN almacen a ON (di.almacen=a.idalmacen)
  9.     WHERE di.idalmacen=@idalmacen
  10.     GROUP BY id.producto,p.descripcion,di.unidad
  11.     ) AS t1
  12. END

para que pruebes y digas si te funciono ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 26/06/2014, 14:01
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Código SQL:
Ver original
  1. Acabo de realizar la prueba y salió igual =/
  2.  
  3. ALTER PROC SP_CONSULTAR_STOCK_POR_ALMACEN
  4. @idalmacen NCHAR(2)
  5. AS
  6. BEGIN
  7. SELECT idproducto,descripcion,(t_peso-t_consumo) AS stock, unidad FROM(
  8. SELECT di.idproducto,p.descripcion,SUM(di.peso_especifico_gr) AS t_peso, SUM(dsi.consumo) AS t_consumo, di.unidad FROM detalleinventario di
  9. INNER JOIN producto p ON (p.idproducto=di.idproducto)
  10. LEFT JOIN detallesalidainventario dsi ON (di.idproducto=dsi.idproducto)
  11. INNER JOIN almacen a ON (di.idalmacen=a.idalmacen)
  12. WHERE di.idalmacen=@idalmacen
  13. GROUP BY di.idproducto, p.descripcion,di.unidad
  14. ) AS t1
  15. END
  #12 (permalink)  
Antiguo 26/06/2014, 14:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Lo que pasa es que con la estructura de datos que tienes al hacer el query que mencionas se genera un producto cartesiano es decir tienes registros duplicados, lo mas indicado seria hacer algo como esto:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id_producto VARCHAR(20),
  4. peso_especifico DECIMAL(6,2),
  5. unidad VARCHAR(10)
  6. )
  7.  
  8. CREATE TABLE #temp2
  9. (
  10. id_producto VARCHAR(20),
  11. consumo DECIMAL(6,2),
  12. unidad VARCHAR(10)
  13. )
  14.  
  15. INSERT INTO #temp VALUES ('cat0100001',5.00,'LTR')
  16. INSERT INTO #temp VALUES ('cat0100001',5.00,'LTR')
  17. INSERT INTO #temp VALUES ('cat0100002',6937.500,'GR')
  18.  
  19. INSERT INTO #temp2 VALUES ('cat0100001',.50,'LTR')
  20. INSERT INTO #temp2 VALUES ('cat0100002',670.00,'GR')
  21. INSERT INTO #temp2 VALUES ('cat0100002',998.00,'GR')
  22.  
  23.  
  24. SELECT t1.id_producto, t1.total-t2.total AS stock, t1.unidad FROM(
  25. SELECT id_producto,SUM(peso_especifico) AS total, unidad FROM #temp AS t1 GROUP BY id_producto,unidad
  26. ) AS t1
  27. LEFT JOIN
  28. (SELECT id_producto,SUM(consumo) AS total, unidad FROM #temp2 AS t1 GROUP BY id_producto,unidad) AS t2 ON (t1.id_producto=t2.id_producto)

con ese query obtienes lo que necesitas:

id_producto stock unidad
-------------------- --------------------------------------- ----------
cat0100001 9.50 LTR
cat0100002 5269.50 GR



saludos!

P.S: Te recomiendo un mejor diseño en tu base de datos ;) por ejemplo lo que estas haciendo con 2 tablas(el ejemplo) se puede hacer con una sola, teniendo un identificador para las entradas y las salidas, asi mismo te recomiendo investigues sobre normalizacion de tablas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 26/06/2014 a las 14:29
  #13 (permalink)  
Antiguo 26/06/2014, 14:33
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Entiendo...creo que intentaré probar otra solución, ya que al agregar el almacén (Son 25 almacenes en esta empresa) + la guía de ingreso de productos, se genera el problema al enlazarlo con la salida de productos (o consumo)
  #14 (permalink)  
Antiguo 26/06/2014, 14:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

el problema no es el almacen es que tienes 2 tablas una para entradas y otra para salidas que tienen casi la misma informacion lo mejor seria tener una tabla para movimientos, algo como esto:

id_movimiento id_tipo producto catidad id_almacen etc.....

una tabla para tipos (para manejar entradas y salidas)

id_tipo descripcion

una tabla para almacenes
id_almacen descripcion

ahora para que quieres el id_guia??? o que significa??

P.S:Si te fijas en mi ejemplo no uso almacen y obtengo duplicados, asi que NO la duplicidad no te la da el almacen ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 26/06/2014, 15:18
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Lo que pasa es que la guía transporta los productos que voy a llevar a dicho almacén.
Ese número de guía lo necesitamos registrar para saber qué productos salieron, ya que el formulario tiene un campo fecha y también se hará un reporte de guías por fecha.
  #16 (permalink)  
Antiguo 26/06/2014, 15:30
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Acabo de pedir ayuda a un amigo que curiosamente, conocía bastante de SQL y me pasó la solución. (Sin el campo descripción del producto). Cabe resaltar que tuve que crear una tabla "Resultados"
Lo adjunto por su alguien necesita.
Código SQL:
Ver original
  1. CREATE PROC SP_CONSULTAR_STOCK_POR_ALMACEN
  2. @IDALMACEN NCHAR(2)
  3. AS
  4. BEGIN
  5. TRUNCATE TABLE Resultados
  6. --- Se Declare el Cursor
  7. DECLARE C1 CURSOR FOR
  8. SELECT idProducto,SUM(peso_especifico_gr) FROM DetalleInventario WHERE idAlmacen=@IDALMACEN GROUP BY idProducto --- Select con los campos que necesitas
  9. OPEN C1 --- se abre el cursor
  10. --- Variables para recibir los valores del select
  11. DECLARE @IdProducto VARCHAR(10)
  12. DECLARE @CantEntrante DECIMAL(9, 3)
  13. DECLARE @CantSaliente DECIMAL(9, 3)
  14. --- Se cargan los valores del cursor en las variables
  15. FETCH NEXT FROM C1 INTO @IdProducto,@CantEntrante
  16. WHILE(@@FETCH_STATUS=0)
  17. BEGIN
  18. SET @CantSaliente = (SELECT SUM(Consumo) FROM DetalleSalidaInventario WHERE idProducto=@IdProducto)
  19. INSERT INTO Resultados(idalmacen,idproducto,Stock) VALUES (@IDALMACEN,@IdProducto,@CantEntrante - ISNULL(@CantSaliente,0))
  20. FETCH NEXT FROM C1 INTO @IdProducto,@CantEntrante --- se pasa al siguiente record del cursor
  21. END
  22. CLOSE C1
  23. DEALLOCATE C1
  24. SELECT * FROM Resultados
  25. END
  26. GO

Saludos
  #17 (permalink)  
Antiguo 26/06/2014, 15:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

disculpa pero tu amigo no sabe tanto de sql como piensas, con el query que te di obtienes lo que necesitas no hace falta que hagas un cursor, ahora te comento que tu diseño de base de datos esta mal, pero bueno si te funciona adelante, yo te estoy dando mis recomendaciones y mi sulucion(no tengo tu codigo para que sea la que tienes que aplicar)

Hay diferentes modos de matar a una mosca tu amigo te dice que la mates con una bazuka, yo que la mates con un matamoscas ;)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #18 (permalink)  
Antiguo 26/06/2014, 15:48
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Estimado, no critico tus habilidades en absoluto y posiblemente tú sabes más que él.

Agradezco tu ayuda y seguramente la solución que me diste, funciona mucho mejor que la que me dio mi amigo.

Yo no tengo idea porque soy novato y es seguro que el diseño de mi base de datos está mal, pero creo que así se aprende.

Lo estoy haciendo con la información que encuentro consultando en google y voy probando. Recién tengo 3 meses en esto y ya cuando tenga algunos años de experiencia, ya no cometeré estos errores que hago ahora.

Muchas gracias por tu tiempo y ayuda, consideremos lo que puse como otra opción de solución alternativa a la tuya...

Todos los consejos son y deben ser bien recibidos..."un consejo, hasta de un conejo", dicen por ahí.

¡Gracias, nuevamente!
  #19 (permalink)  
Antiguo 26/06/2014, 16:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Cita:
Iniciado por surrealista Ver Mensaje
Estimado, no critico tus habilidades en absoluto y posiblemente tú sabes más que él.

Agradezco tu ayuda y seguramente la solución que me diste, funciona mucho mejor que la que me dio mi amigo.

Yo no tengo idea porque soy novato y es seguro que el diseño de mi base de datos está mal, pero creo que así se aprende.

Lo estoy haciendo con la información que encuentro consultando en google y voy probando. Recién tengo 3 meses en esto y ya cuando tenga algunos años de experiencia, ya no cometeré estos errores que hago ahora.

Muchas gracias por tu tiempo y ayuda, consideremos lo que puse como otra opción de solución alternativa a la tuya...

Todos los consejos son y deben ser bien recibidos..."un consejo, hasta de un conejo", dicen por ahí.

¡Gracias, nuevamente!
Como te lo dije si te funciona la solucion adelante, solo que si te pones a analizar un poquito mi solucion te podras encontrar una bella sorpresa :), y veras que la solucion de tu amigo es "eficiente" hasta cierto punto :), ahora como tambien mencione no tengo tus datos por lo que tengo que usar temporales con datos ficticios, tu amigo movio sobre tus datos por lo que su solucion te funciono al "dedazo", esta perfecto que hayas encontrado una solucion alterna a la que te di, pero tomalo como consejo que tu diseño de base no esta bien y necesitas analizarlo mas ;)


un saludo y por aqui andamos
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 03/07/2014, 14:35
 
Fecha de Ingreso: junio-2014
Mensajes: 11
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Siguiendo tu consejo, lo hice de la forma normal.

Código SQL:
Ver original
  1. ALTER PROC SP_CONSULTAR_STOCK_POR_ALMACEN
  2. @IDALMACEN NCHAR(2)
  3. AS
  4. BEGIN
  5. SELECT PRODUCTO.IDPRODUCTO AS 'COD. DEL PRODUCTO', PRODUCTO.DESCRIPCION AS 'DESCR. PRODUCTO',
  6. STOCK=(SELECT  CASE WHEN SUM(PESO_ESPECIFICO_GR)<>0 THEN SUM(PESO_ESPECIFICO_GR)
  7. END FROM DETALLEINVENTARIO WHERE IDALMACEN=@IDALMACEN AND DETALLEINVENTARIO.IDPRODUCTO = PRODUCTO.IDPRODUCTO)
  8. -(SELECT CASE WHEN SUM(CONSUMO)<>0 THEN SUM(CONSUMO) END FROM DETALLESALIDAINVENTARIO
  9. WHERE IDALMACEN=@IDALMACEN AND DETALLESALIDAINVENTARIO.IDPRODUCTO = PRODUCTO.IDPRODUCTO), PRODUCTO.UNIDAD
  10. FROM PRODUCTO, DETALLEINVENTARIO
  11. WHERE PRODUCTO.IDPRODUCTO = DETALLEINVENTARIO.IDPRODUCTO AND DETALLEINVENTARIO.IDALMACEN=@IDALMACEN
  12. GROUP BY PRODUCTO.IDPRODUCTO, PRODUCTO.DESCRIPCION, PRODUCTO.UNIDAD
  13. END
  14. GO

Ojalá a alguien le pueda servir.
  #21 (permalink)  
Antiguo 03/07/2014, 14:52
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cálculo de Stock con 2 tablas y procedimiento almacenado.

Te dije que no necesitabas cursores ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: procedimiento, server, sql, stock, tablas
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 23:07.