El quiebre de stock que nadie vio venir (y que costó una fortuna)
Hay pocas cosas más frustrantes en una operación que descubrir que te quedaste sin un producto clave cuando un cliente lo necesita. El pedido se pierde, la confianza se erosiona y el equipo comercial señala a bodega, que señala a compras, que señala al sistema. La realidad es que las alertas de stock mínimo en SAP Business One pueden prevenir este escenario, pero la mayoría de las empresas no las configura correctamente — o directamente no las usa.
En este tutorial vas a aprender a configurar paso a paso las alertas de stock mínimo en SAP Business One, desde la definición de niveles en el maestro de artículos hasta la activación de notificaciones automáticas. Además, incluyo queries con versiones para SQL Server y SAP HANA que te ayudarán a diagnosticar y optimizar tu gestión de inventario.
¿Por qué las alertas de stock mínimo en SAP Business One son críticas?
Quiebres de stock: Cada vez que un producto no está disponible cuando se necesita, pierdes ventas directas y credibilidad. En consecuencia, el cliente busca alternativas y muchas veces no regresa.
Sobrestock: Sin niveles definidos, compras «por si acaso» y terminas con capital inmovilizado en bodega. Por lo tanto, tu flujo de caja se deteriora silenciosamente.
Decisiones reactivas: Sin alertas, el equipo de compras trabaja apagando incendios en lugar de planificar. Además, la falta de visibilidad genera desconfianza entre las áreas.
Costo oculto: El quiebre de stock no solo pierde la venta puntual, sino que genera compras urgentes a precios más altos, envíos express y horas extras en producción.
Paso 1: Definir niveles mínimos en el Maestro de Artículos
El primer paso para configurar alertas de stock mínimo en SAP Business One es definir los niveles en cada artículo. Ve a Inventario → Datos maestros del artículo y en la pestaña Datos de inventario encontrarás tres campos clave por almacén:
Stock mínimo (MinStock): La cantidad por debajo de la cual se genera una alerta. Es tu línea roja de inventario.
Stock máximo (MaxStock): El techo que no deberías superar para evitar sobrestock y capital inmovilizado.
Punto de reorden (ReorderPoint): La cantidad a la cual deberías lanzar una nueva orden de compra considerando el lead time del proveedor.
La fórmula práctica para definir estos valores es: Stock mínimo = Consumo diario promedio × Días de cobertura de seguridad. Para calcular esto necesitas datos reales de consumo, que puedes obtener con la query del Paso 4.
Paso 2: Activar la alerta de desviación de stock mínimo
Una vez definidos los niveles, necesitas activar las alertas automáticas. Ve a Administración → Gestión de alertas → Alertas de usuario y busca la alerta predefinida «Desviación del stock mínimo». Actívala y configura:
Frecuencia: Cada cuánto tiempo SAP B1 verifica los niveles. Para productos críticos, revisa diariamente. Para otros, semanal puede ser suficiente.
Destinatarios: Asigna la alerta al responsable de compras y al jefe de bodega. Sin embargo, evita enviarla a demasiadas personas porque perderá impacto.
Prioridad: Marca las alertas de productos clase A como alta prioridad para que se destaquen en la bandeja de alertas.
Paso 3: Cuándo se dispara la alerta
La alerta se activa cuando una transacción de salida de inventario (entrega, transferencia, entrada de mercancía negativa) reduce el stock por debajo del nivel mínimo definido. Es importante entender que la alerta es reactiva: se dispara después del movimiento, no antes.
Por lo tanto, el punto de reorden cobra especial relevancia. Si configuras correctamente el punto de reorden, podrás generar órdenes de compra antes de alcanzar el stock mínimo. Además, el MRP puede complementar esto con un enfoque proactivo basado en demanda proyectada.
Paso 4: Configurar alertas masivas con queries SQL
Cuando tienes cientos de artículos sin stock mínimo definido, configurarlos uno por uno es inviable. Esta query identifica artículos con stock activo pero sin nivel mínimo configurado y sugiere un valor basado en el consumo real de los últimos 6 meses.
Versión SQL Server
SELECT
T0.ItemCode AS 'Código',
T0.ItemName AS 'Descripción',
T1.WhsCode AS 'Almacén',
CAST(T1.OnHand AS DECIMAL(15,2)) AS 'Stock Actual',
T1.MinStock AS 'Mínimo Actual',
ISNULL(Consumo.PromedioMensual, 0) AS 'Consumo Mensual',
CAST(ISNULL(Consumo.PromedioMensual, 0) * 1.5 AS DECIMAL(15,0)) AS 'Mínimo Sugerido'
FROM OITM T0
INNER JOIN OITW T1 ON T1.ItemCode = T0.ItemCode
LEFT JOIN (
SELECT ItemCode, Warehouse,
CAST(SUM(ABS(InQty - OutQty)) / 6.0 AS DECIMAL(15,2)) AS PromedioMensual
FROM OINM
WHERE DocDate >= DATEADD(MONTH, -6, GETDATE())
AND TransType IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
GROUP BY ItemCode, Warehouse
) Consumo ON Consumo.ItemCode = T0.ItemCode
AND Consumo.Warehouse = T1.WhsCode
WHERE T1.OnHand > 0 AND T0.InvntItem = 'Y'
AND (T1.MinStock = 0 OR T1.MinStock IS NULL)
ORDER BY ISNULL(Consumo.PromedioMensual, 0) DESCVersión SAP HANA
SELECT
T0."ItemCode" AS "Código",
T0."ItemName" AS "Descripción",
T1."WhsCode" AS "Almacén",
CAST(T1."OnHand" AS DECIMAL(15,2)) AS "Stock Actual",
T1."MinStock" AS "Mínimo Actual",
IFNULL("Consumo"."PromedioMensual", 0) AS "Consumo Mensual",
CAST(IFNULL("Consumo"."PromedioMensual", 0) * 1.5 AS DECIMAL(15,0)) AS "Mínimo Sugerido"
FROM "OITM" T0
INNER JOIN "OITW" T1 ON T1."ItemCode" = T0."ItemCode"
LEFT JOIN (
SELECT "ItemCode", "Warehouse",
CAST(SUM(ABS("InQty" - "OutQty")) / 6.0 AS DECIMAL(15,2)) AS "PromedioMensual"
FROM "OINM"
WHERE "DocDate" >= ADD_MONTHS(CURRENT_DATE, -6)
AND "TransType" IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
GROUP BY "ItemCode", "Warehouse"
) "Consumo" ON "Consumo"."ItemCode" = T0."ItemCode"
AND "Consumo"."Warehouse" = T1."WhsCode"
WHERE T1."OnHand" > 0 AND T0."InvntItem" = 'Y'
AND (T1."MinStock" = 0 OR T1."MinStock" IS NULL)
ORDER BY IFNULL("Consumo"."PromedioMensual", 0) DESCEsta query calcula el consumo mensual promedio de los últimos 6 meses y sugiere un stock mínimo de 1.5 veces ese valor. Ajusta el multiplicador según tu industria y la criticidad de cada artículo. En consecuencia, obtendrás niveles mínimos basados en datos reales en lugar de suposiciones.
Paso 5: Integrar con el Asistente de Planificación (MRP)
Las alertas son reactivas. Para un enfoque proactivo, complementa con el MRP (MRP → Asistente de planificación). El MRP analiza demanda futura contra stock actual y genera recomendaciones de compra automáticamente.
Para que funcione correctamente con tus alertas, los tiempos de entrega de cada proveedor deben estar actualizados en el maestro de artículos. Además, los lotes mínimos de compra deben estar configurados si tu proveedor tiene cantidades mínimas. Por lo tanto, el punto de reorden debe estar alineado con la fórmula: Consumo diario × Lead time + Stock de seguridad.
Query bonus: Dashboard de cobertura de inventario
Esta query complementa las alertas mostrando cuántos días de cobertura tiene cada artículo según su consumo reciente. Es fundamental para priorizar las compras.
Versión SQL Server
SELECT
T0.ItemCode AS 'Código',
T0.ItemName AS 'Descripción',
T1.WhsCode AS 'Almacén',
CAST(T1.OnHand AS DECIMAL(15,2)) AS 'Stock Actual',
T1.MinStock AS 'Stock Mínimo',
ISNULL(Consumo.PromedioDiario, 0) AS 'Consumo Diario',
CASE WHEN ISNULL(Consumo.PromedioDiario, 0) = 0 THEN 999
ELSE CAST(T1.OnHand / Consumo.PromedioDiario AS INT)
END AS 'Días Cobertura',
CASE
WHEN ISNULL(Consumo.PromedioDiario, 0) = 0 THEN 'Sin Movimiento'
WHEN T1.OnHand / Consumo.PromedioDiario <= 7 THEN 'CRÍTICO'
WHEN T1.OnHand / Consumo.PromedioDiario <= 15 THEN 'BAJO'
WHEN T1.OnHand / Consumo.PromedioDiario <= 30 THEN 'NORMAL'
ELSE 'HOLGADO'
END AS 'Estado'
FROM OITM T0
INNER JOIN OITW T1 ON T1.ItemCode = T0.ItemCode
LEFT JOIN (
SELECT ItemCode, Warehouse,
CAST(SUM(ABS(InQty - OutQty)) / 180.0 AS DECIMAL(15,4)) AS PromedioDiario
FROM OINM
WHERE DocDate >= DATEADD(MONTH, -6, GETDATE())
AND TransType IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
GROUP BY ItemCode, Warehouse
) Consumo ON Consumo.ItemCode = T0.ItemCode
AND Consumo.Warehouse = T1.WhsCode
WHERE T1.OnHand > 0 AND T0.InvntItem = 'Y'
ORDER BY CASE WHEN ISNULL(Consumo.PromedioDiario, 0) = 0 THEN 999
ELSE CAST(T1.OnHand / Consumo.PromedioDiario AS INT) END ASCVersión SAP HANA
SELECT
T0."ItemCode" AS "Código",
T0."ItemName" AS "Descripción",
T1."WhsCode" AS "Almacén",
CAST(T1."OnHand" AS DECIMAL(15,2)) AS "Stock Actual",
T1."MinStock" AS "Stock Mínimo",
IFNULL("Consumo"."PromedioDiario", 0) AS "Consumo Diario",
CASE WHEN IFNULL("Consumo"."PromedioDiario", 0) = 0 THEN 999
ELSE CAST(T1."OnHand" / "Consumo"."PromedioDiario" AS INT)
END AS "Días Cobertura",
CASE
WHEN IFNULL("Consumo"."PromedioDiario", 0) = 0 THEN 'Sin Movimiento'
WHEN T1."OnHand" / "Consumo"."PromedioDiario" <= 7 THEN 'CRÍTICO'
WHEN T1."OnHand" / "Consumo"."PromedioDiario" <= 15 THEN 'BAJO'
WHEN T1."OnHand" / "Consumo"."PromedioDiario" <= 30 THEN 'NORMAL'
ELSE 'HOLGADO'
END AS "Estado"
FROM "OITM" T0
INNER JOIN "OITW" T1 ON T1."ItemCode" = T0."ItemCode"
LEFT JOIN (
SELECT "ItemCode", "Warehouse",
CAST(SUM(ABS("InQty" - "OutQty")) / 180.0 AS DECIMAL(15,4)) AS "PromedioDiario"
FROM "OINM"
WHERE "DocDate" >= ADD_MONTHS(CURRENT_DATE, -6)
AND "TransType" IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
GROUP BY "ItemCode", "Warehouse"
) "Consumo" ON "Consumo"."ItemCode" = T0."ItemCode"
AND "Consumo"."Warehouse" = T1."WhsCode"
WHERE T1."OnHand" > 0 AND T0."InvntItem" = 'Y'
ORDER BY CASE WHEN IFNULL("Consumo"."PromedioDiario", 0) = 0 THEN 999
ELSE CAST(T1."OnHand" / "Consumo"."PromedioDiario" AS INT) END ASCLos artículos en estado CRÍTICO (menos de 7 días de cobertura) necesitan acción inmediata. Además, nota que en SAP HANA se usa ADD_MONTHS en lugar de DATEADD e IFNULL en lugar de ISNULL.
Buenas prácticas para alertas de stock mínimo en SAP Business One
Revisa los niveles trimestralmente: El consumo cambia con la estacionalidad. Un stock mínimo fijo durante todo el año te dejará desprotegido en temporada alta y con exceso en temporada baja.
Clasifica tus artículos con ABC: No todos los productos merecen el mismo nivel de atención. Los artículos clase A (alto valor o alto movimiento) necesitan niveles más conservadores y revisiones más frecuentes.
Documenta las excepciones: Si un artículo tiene un comportamiento atípico (compra anual, producto estacional), documéntalo en el campo de observaciones para que el equipo entienda por qué el mínimo está configurado de cierta manera.
Monitorea la efectividad: Lleva un registro de quiebres de stock antes y después de implementar las alertas. Sin embargo, no basta con activarlas: necesitas medir su impacto real.
Conclusión: las alertas son tu sistema nervioso de inventario
Configurar alertas de stock mínimo en SAP Business One no es un proyecto de una semana: es un hábito operativo que necesita mantenimiento. Las queries presentadas, disponibles tanto para SQL Server como para SAP HANA, te dan las herramientas para diagnosticar tu situación actual, definir niveles basados en datos reales y monitorear la cobertura de forma continua.
En consecuencia, tu equipo de compras dejará de trabajar reactivamente y comenzará a anticipar necesidades. La diferencia entre una empresa que controla su inventario y una que lo sufre está en estos detalles de configuración.




