23 de julio de 2010

Cálculo del lote económico en SAP Business One.


En este post, expondremos como poder obtener, para cada artículo, una nueva información relacionada con el stock, el lote económico, calculado según la formula de Harrys-Wilson. En 1934, Wilson introduce el concepto de Lote Económico, mediante una formula, que permite calcular la cantidad óptima de reabastecimiento y el tiempo óptimo entre dos pedidos de un producto para una entidad dada (planta, centro logístico, almacén,…). Existen unas premisas a tener en cuenta:
  • El horizonte que afecta a la gestión de stocks es ilimitado, por lo que el proceso continúa de forma indefinida.
  • La demanda es continua, conocida y homogénea en el tiempo, por lo que se supone que la tasa de consumo es D unidades/año.
  • El plazo de entrega, L, es constante y conocido.
  • No se aceptan rupturas de stock.
  • El coste variable de adquisición es constante, CA €/unidad.
  • La entrada del lote en el sistema es instantáneo al transcurrir el plazo de entrega.
  • El lote tendrá siempre el mismo tamaño, para que los parámetros del modelo sean constantes.
  • Se considera un coste de lanzamiento del pedido de CL €/pedido. Este es el coste total de ejecutar, seguir y realizar un pedido.
  • Se considera un coste de posesión de stock igual a CP €/unidad. Este es el coste total de almacenar un articulo, (espacio, gestión, manipulación, financiación,…).
El lote económico, Q es la cantidad del lote asociado a los mínimos costes relacionados con los stocks, es decir, se trata del lote que minimiza la función de coste total anual de stock. Para aplicar este concepto a SAP B1 crearemos 2 campos de usuario a cada artículo, uno para Coste de lanzamiento (CL), y otro para Coste de Posesión (CP). Estos campos deben rellenarse con los costes adecuados. Crear una query para aplicar la formula de Wilson, y obtener para cada artículo el lote económico. El contenido de la Query es:

declare @dataInicio datetime
declare @dataFinal datetime
declare @tempo int

SET @tempo=(SELECT TOP 1 T0.TRANSNUM FROM OINM T0 WHERE T0.[DocDate] >=[%0] AND T0.[DocDate] <=[%1])
SET @dataInicio=(SELECT '[%0]')
SET @dataFinal=(SELECT '[%1]')
SELECT s.itemcode ,Consumo=sum(s.outqty) ,[Lote Economico]=round(sqrt( (2*max(a.U_SE_LECL)*sum(s.outqty)) /max(a.U_SE_LECP)),2) ,[NumPedidos Periodo]=round((sum(s.outqty)/sqrt( (2*max(a.U_SE_LECL)*sum(s.outqty))/max(a.U_SE_LECP))),2) ,[CicloAprov. Dias]=round(datediff(day,@dataInicio,@dataFinal)/(sum(s.outqty)/ sqrt( (2*max(a.U_SE_LECL)*sum(s.outqty))/max(a.U_SE_LECP))),0)
FROM OINM s JOIN OITM a ON a.ItemCode=s.ItemCode
WHERE s.docdate BETWEEN @dataInicio AND @dataFinal
AND s.outqty>0 and a.U_SE_LECL>0 and a.U_SE_LECP>0
GROUP BY s.itemcode
ORDER BY s.itemcode

Al ejecutarla, nos pide como parámetros el ámbito de tiempo entre fechas para calcular el consumo y el reparto posterior del lote económico. El resultado es el que sigue: El listado nos muestra la siguiente información:
  • La primera columna nos indica el código del articulo.
  • El consumo de cada artículo en el periodo indicado al inicio.
  • El lote económico según la formula de Wilson y los datos entrados.
  • El numero de pedidos a realizar durante el periodo estudiado.
  • El ciclo de aprovisionamiento en días, o cada cuantos días es necesario realizar un pedido.
Al final, con estos datos, podemos utilizarlos en el aprovisionamiento estándar de SAP B1 de la siguiente forma:
  • El dato de Lote económico guardarlo en el campo 'Pedido múltiple' de la pestaña planificación del maestro de artículos, así se utiliza en el cálculo de necesidades (MRP) estándar de SAP B1.
No cabe decir que el lote económico es un valor teórico, que se debe tomar como tal y cada usuario debe ser consciente de utilizarlo de la mejor manera posible dentro de los parámetros reales y restricciones que puedan imponer los proveedores, tales como paquetes, múltiplos, cantidades mínimas, etc. Es decir, la cantidad del lote económico nos indica una posición optima, que deberá ser ajustada a la realidad en la medida de cada caso.

2 comentarios:

  1. De donde se obtiene el campo a.U_SE_LECL?

    Gracias

    ResponderEliminar
  2. Hola, alguien tiene la consulta pero de tal manera que los años sean variables y no fijos?

    declare @dataInicio datetime
    declare @dataFinal datetime
    declare @tempo int

    SET @tempo=(SELECT TOP 1 T0.TRANSNUM FROM OINM T0 WHERE T0.[DocDate] >=[%0] AND T0.[DocDate] <=[%1])
    SET @dataInicio=(SELECT '[%0]')
    SET @dataFinal=(SELECT '[%1]')
    SELECT s.itemcode ,Consumo=sum(s.outqty) ,[Lote Economico]=round(sqrt( (2*max(a.U_SE_LECL)*sum(s.outqty)) /max(a.U_SE_LECP)),2) ,[NumPedidos Periodo]=round((sum(s.outqty)/sqrt( (2*max(a.U_SE_LECL)*sum(s.outqty))/max(a.U_SE_LECP))),2) ,[CicloAprov. Dias]=round(datediff(day,@dataInicio,@dataFinal)/(sum(s.outqty)/ sqrt( (2*max(a.U_SE_LECL)*sum(s.outqty))/max(a.U_SE_LECP))),0)
    FROM OINM s JOIN OITM a ON a.ItemCode=s.ItemCode
    WHERE s.docdate BETWEEN @dataInicio AND @dataFinal
    AND s.outqty>0 and a.U_SE_LECL>0 and a.U_SE_LECP>0
    GROUP BY s.itemcode
    ORDER BY s.itemcode

    ResponderEliminar