Mi primera vez, perdón primera entrega tecnológica está enfocado en la programación y un pequeño código aparentemente muy simple para un programador experimentado en código Transact SQL pero que resulta todo un quebradero de cabeza para un novato, los que no están familiarizados con la programación en Base de datos o tienes esos días nublados que dan ganas de salir corriendo de la office.
Muchos foros quizás intentan ayudar pero quizá involuntariamente lo dejan a medias ó con la intención de que el usuario investigue para completar lo que busca pero cuando la emergencia apremia tanto en el trabajo bajo presión ó tienes que completar un trabajo de estudio entonces es necesario que tengas la solución completa y que mejor es que obviamente después de esto tengas las gracias virtuales al menos.
Vamos al grano, resulta que en un Sistema de inventarios de acuerdo a una estructura tradicional ó estándar tenemos definido las Tablas de la siguiente manera:
- Productos
- Compras (Compras, ComprasDetalles)
- Pedidos (Pedidos, PedidosDetalles)
- Etc.
Resulta que necesitamos actualizar nuestros saldos del Maestro de Productos en función de los detalles de Pedidos por Código de Producto así que tenemos el siguiente código:
UPDATE Productos
SET Productos.StkActual =
(SELECT SUM(det.Cantidad)
FROM PedidosDetalles AS det
WHERE Productos.ProductoID=det.ProductoID
GROUP BY det.ProductoID)
A simple vista dirías YES, tengo la solución, lo ejecutas en tú DB, pero después de finalizado el proceso la desilusión sería demasiado que buscarías saltar por la ventana.
Explicación:
Resulta que si un Producto X tiene movimientos en PedidosDetalles entonces genial el proceso se cumple porqué acumula todas las Cantidades del Producto X y los reemplaza, suma ó resta según tú criterio en Productos, pero si no tiene movimientos entonces devuelve un valor NULL y reemplazará tú Stock con este valor y a llorar a la playa.
Para eso es necesario validad UPDATE con WHERE, el código completo y seguro es este:
UPDATE Productos
SET Productos.StkActual =
(SELECT SUM(det.Cantidad)
FROM PedidosDetalles AS det
WHERE Productos.ProductoID=det.ProductoID
GROUP BY det.ProductoID)
WHERE
(SELECT SUM(det.Cantidad)
FROM PedidosDetalles AS det
WHERE Productos.ProductoID=det.ProductoID
GROUP BY det.ProductoID) IS NOT NULL
Ojo con la última parte del código con Where lo que hacemos es validar el resultado de la consulta SELECT para que solo actualice los valor diferentes a nulo.
Espero sea de utilidad.
No hay comentarios:
Publicar un comentario
Sus comentarios son bienvenidos...