Stock por almacén valorizado

La mayoría de clientes que tenemos actualmente son del rubro retail. En el rubro es muy importante mantener los stock de las tiendas dentro de los rangos establecidos en los mínimos y máximos.

Mi primer query para calcular el stock (simulando la auditoria de stock pero no tan lento) cuando la implementé en un cliente retail grande fue como si me hubieran vaciado un balde con agua fría, era lentísima (30 minutos mas o menos), más rápida que el auditoria de stock pero muy lenta de todas maneras.

Con ese problema, me puse en plan «optimizar el query» y obtuve el siguiente código, mucho mas rápido y con el mismo resultado.

declare
	@date date

set @date = (/*select top 1 A.RefDate from OJDT A where A.RefDate=*/'[%0]')

select distinct 
	T2.[ItemCode], 
	T2.[ItemName], 
	T1.[WhsCode], 
	T1.WhsName,
	isnull(sum(T6.Saldo),0) [Stock],
	(case sum(T7.TransValue) when 0 then 1 else sum(T7.TransValue) end)/(case sum(T7.Saldo) when 0 then 1 else sum(T7.Saldo) end) [PMP],
	sum(T6.Saldo)*((case sum(T7.TransValue) when 0 then 1 else sum(T7.TransValue) end)/(case sum(T7.Saldo) when 0 then 1 else sum(T7.Saldo) end)) [Valorizado]

from OITM T2
inner JOIN OITW T0 ON T0.ItemCode=T2.ItemCode
inner JOIN OWHS T1 ON T1.WhsCode=T0.WhsCode
left join (
			select A0.ItemCode, A0.Warehouse, (A0.InQty-A0.OutQty) [Saldo], A0.TransValue 
			from OINM A0
			where A0.DocDate<=@date 
			) T6 on T6.ItemCode=T0.ItemCode and T6.Warehouse=T0.WhsCode
left join (
			select A1.ItemCode, sum(A1.InQty-A1.OutQty) [Saldo], sum(A1.TransValue) [TransValue]
			from OINM A1
			where A1.DocDate<=@date 
			group by A1.ItemCode
			) T7 on T7.ItemCode=T0.ItemCode and T7.ItemCode=T6.ItemCode

group by T2.[ItemCode], T2.[ItemName], T1.[WhsCode], T1.WhsName
having sum(T6.Saldo)<>0
order by 1,3

Y desde ese momento es este el código que dejo en cada nuevo cliente.

Espero les sirva.

Saludos

También te podría gustar...

20 Respuestas

  1. jose dice:

    como harias para obtener la cantidad acumulada que sale en SAP?

  2. Edwin dice:

    Hola;

    Puedes compartir el script de las tablas que usas para esa consulta.

  3. Christian dice:

    Hola muy buen aporte, pero si quisiera saber el detalle del lote del producto, que deberia modificar?

  4. Juanzeva dice:

    Felicitaciones, muy buen aporte, aprovecho la oportunidad para saber si tienen algun query que muestre los stock por lote de un producto.
    el area de ventas necesita visualizar los productos y los stocks de cada lote, gracias.

  5. noe dice:

    oye y si quisiera ver el resultado pero por tipo de movimiento y fechas, se q es mas tardado pero me gustaria ver los mivimientos como el de auditoria de estoy pero en una sola consulta.

    gracias.

  6. Miguel Méndez dice:

    Excelente reporte, me has ayudado un buen, muchas gracias

  7. Vìctor dice:

    Que tal Felipe, el query está muy bueno, pero aparte del filtro de fecha quisiera agregarle un filtro más que es el de Almacén, espero me puedas apoyar, ya que he intentado agregarle un where pero no me muestra ningùn dato cuando genero el reporte

  8. Ricardo Uribe dice:

    Estimado Felipe,

    Una consulta, estoy comparando el valorizado de tu consulta, con el valorizado que muestra SAP en el informe de auditoria de stock y en algunos almacenes hay diferencias.

    A que podría deberse esto?

    Gracias

    • Se debe a que la query está pensada para cuadrar con la contabilidad, con el saldo de las cuentas de existencias, no con los almacenes ya que si usas costo a nivel de empresa deben haber almacenes en negativo y eso no es posible.

      Saludos

      • Ricardo Uribe dice:

        Y que tabla podría usar para sacar el costo del reporte de auditoria de stock, supongo que debe haber un lugar donde se guarde el totalizado por almacén para poder dividirlo contra el saldo y tener el costo unitario.

        Gracias

        • Tienes que intervenir este trozo de código

          left join (
          			select A1.ItemCode, sum(A1.InQty-A1.OutQty) [Saldo], sum(A1.TransValue) [TransValue]
          			from OINM A1
          			where A1.DocDate<=@date 
          			group by A1.ItemCode
          			) T7 on T7.ItemCode=T0.ItemCode and T7.ItemCode=T6.ItemCode
          

          Por este otro

          Responder
  • uziel eduardo casillas dice:

    buen dia felipe, intente modificar el trozo de codigo, pero me sale un mensaje de error, me podrias ayudar poniendo el codigo completo .

    gracias

  • LeonardoCC dice:

    ESTE SERIA EL CODIGO, PARA QUE NO TE SALGA EL ERROR.:

    left join (
    select A1.ItemCode, A1.Warehouse,
    sum(A1.InQty-A1.OutQty) [Saldo],
    sum(A1.TransValue) [TransValue]
    from OINM A1
    where A1.DocDate<=@date
    group by A1.ItemCode, A1.Warehouse
    ) T7 on T7.ItemCode=T0.ItemCode and T7.ItemCode=T6.ItemCode and T7.Warehouse=T0.WhsCode

  • UZIEL EDUARDO CASILLAS JIMENEZ dice:

    buen dia

    ojala me puedas ayudar
    la empresa que trabajo compra libros, es un decir hoy compramos 100 libros a un costo en un dos semanas hay una oferta y nos los vende mas baratos y compramos 100 a otro costo, como se hacen traspasos a los otros almacenes los de un costo quedan en un almacen y si traspaso mas, los del segundo costo quedan en el mismo almacen, si yo saco un inventario, valudo me hace un promedio d elos dos costos.

    yo quiero que me desglose cuantos quedan de cada costo

    muchas gracias, ojala me puedas ayudar

  • Deja una respuesta

    Tu dirección de correo electrónico no será publicada.