Query stock de artículos y costos

Como están!! espero logren ayudarme jaja esto es en Sap Business One 93 PL10

Necesito un informe que me permita ver el stock de los artículos y el valor acumulado de estos (costo), estoy usando auditoria de stock pero no me permite visualizar nada de los artículos que están parametrizados con Método de valoración: Serie/Lote.

El Informe de auditoría de inventario de lotes y series tampoco me sirve ya que me muestra en detalle el movimiento de cada articulo y lote, pero no me muestra el acumulado de estos artículos como un consolidado y sus valores.

Espero me puedan ayudar, si ya tienen un query similar que me muestre los costos y el total de artículos en stock por cada almacen, aun si los artículos están parametrizados como: Serie/Lote ya que de momento no doy con las tablas para sacar estos costos.

Hola @camilog no se si es lo que necesitas, pero si comprendí bien yo utilizo este query

SELECT T0.[ItemCode],T1.[ItemName],  T0.[WhsCode], T1.[InvntryUom] AS 'U/M', T0.[OnHand], T0.[AvgPrice], T0.[OnHand]*T0.[AvgPrice] as 'Valor inventario'
FROM OITW T0  
INNER JOIN OITM T1 ON T0.[ItemCode] = T1.[ItemCode]
WHERE T1.[validFor]='Y'

Espero te sea de ayuda.

3 Me gusta

Si con estándar es complicado sacarlo a mano con serie y lote creo vas a llorar, hasta ahorita no me a tocado trabajar con alguien que utilice ese costeo, pero te puedes basar en OINM, OITL, ITL1 y OBTN/OSRN yo digo que dentro de esa vista y tablas puedes obtener los datos que necesitas, no pasa de que debas ver las entrañas de OINM para llegar una solución.

3 Me gusta

Tengo este Query, pero con el metodo de valoración Serie/Lote el campo [AvgPrice] tiene valor cero.

SELECT DISTINCT 
T0."ItemCode" AS "REFERENCIA", 
T1."ItemName" AS "DESCRIPCIÒN",  
T4."STOCK ACTUAL",
T1."AvgPrice" AS "COSTO PROMEDIO",  
(T4."STOCK ACTUAL" * T1."AvgPrice") AS "COSTO STOCK",
T0."Warehouse" AS "BODEGA", 
T1."IWeight1" AS "PESO UNIDAD", 
T3."WhsName"

FROM "{?Schema@}".OINM T0  
INNER JOIN "{?Schema@}".OITM T1 ON T0."ItemCode" = T1."ItemCode" 
INNER JOIN "{?Schema@}".OITW T2 ON T0."ItemCode" = T2."ItemCode" AND T0."Warehouse" = T2."WhsCode"
INNER JOIN "{?Schema@}".OWHS T3 ON T0."Warehouse" = T3."WhsCode"
LEFT JOIN(SELECT DISTINCT 
			T2."ItemCode", 
			T2."ItemName", 
			T1."WhsCode",
			IFNULL((SELECT DISTINCT (SUM(Y."InQty") - SUM(Y."OutQty")) FROM "{?Schema@}".OINM Y 
					WHERE Y."ItemCode" = T2."ItemCode" 
					AND Y."Warehouse" = T1."WhsCode" 
					AND CAST (Y."DocDate" AS DATE) <= {?3_Fecha_Final@}
				),0)"STOCK ACTUAL",
				
			IFNULL((SELECT DISTINCT (SUM(Y."TransValue")) FROM "{?Schema@}".OINM Y 
					WHERE Y."ItemCode" = T2."ItemCode" 
					AND Y."Warehouse" = T1."WhsCode" 
					AND CAST (Y."DocDate" AS DATE) <= {?3_Fecha_Final@}
				),0)"COSTO STOCK"
			
			FROM "{?Schema@}".OITM T2
			INNER JOIN "{?Schema@}".OITW T0 ON T0."ItemCode" = T2."ItemCode"
			INNER JOIN "{?Schema@}".OWHS T1 ON T1."WhsCode" = T0."WhsCode"
			
			WHERE (SELECT DISTINCT (SUM(Y."InQty") - SUM(Y."OutQty")) FROM "{?Schema@}".OINM Y 
					WHERE Y."ItemCode" = T2."ItemCode" 
					AND Y."Warehouse" = T1."WhsCode" 
					AND CAST (Y."DocDate" AS DATE) <= {?3_Fecha_Final@}
				) != '0'
			
			ORDER BY T2."ItemCode", T1."WhsCode"
			)T4 ON T0."ItemCode" = T4."ItemCode"
			AND T0."Warehouse" = T4."WhsCode"

WHERE 
T0."Warehouse" BETWEEN {?1_Bodega_Inicial@} AND {?2_Bodega_Final@} 
AND CAST (T0."DocDate" AS DATE) <= {?3_Fecha_Final@}
AND T4."STOCK ACTUAL" > 0 

ORDER BY T0."ItemCode"

Lo se, es un caos

De momento trabajo con este, pero como digo inicialmente en el post no me trae el costo de los articulos con valoración Serie/Lote

SELECT DISTINCT 
T0."ItemCode" AS "REFERENCIA", 
T1."ItemName" AS "DESCRIPCIÒN",  
T4."STOCK ACTUAL",
T1."AvgPrice" AS "COSTO PROMEDIO",  
(T4."STOCK ACTUAL" * T1."AvgPrice") AS "COSTO STOCK",
T0."Warehouse" AS "BODEGA", 
T1."IWeight1" AS "PESO UNIDAD", 
T3."WhsName"

FROM "{?Schema@}".OINM T0  
INNER JOIN "{?Schema@}".OITM T1 ON T0."ItemCode" = T1."ItemCode" 
INNER JOIN "{?Schema@}".OITW T2 ON T0."ItemCode" = T2."ItemCode" AND T0."Warehouse" = T2."WhsCode"
INNER JOIN "{?Schema@}".OWHS T3 ON T0."Warehouse" = T3."WhsCode"
LEFT JOIN(SELECT DISTINCT 
			T2."ItemCode", 
			T2."ItemName", 
			T1."WhsCode",
			IFNULL((SELECT DISTINCT (SUM(Y."InQty") - SUM(Y."OutQty")) FROM "{?Schema@}".OINM Y 
					WHERE Y."ItemCode" = T2."ItemCode" 
					AND Y."Warehouse" = T1."WhsCode" 
					AND CAST (Y."DocDate" AS DATE) <= {?3_Fecha_Final@}
				),0)"STOCK ACTUAL",
				
			IFNULL((SELECT DISTINCT (SUM(Y."TransValue")) FROM "{?Schema@}".OINM Y 
					WHERE Y."ItemCode" = T2."ItemCode" 
					AND Y."Warehouse" = T1."WhsCode" 
					AND CAST (Y."DocDate" AS DATE) <= {?3_Fecha_Final@}
				),0)"COSTO STOCK"
			
			FROM "{?Schema@}".OITM T2
			INNER JOIN "{?Schema@}".OITW T0 ON T0."ItemCode" = T2."ItemCode"
			INNER JOIN "{?Schema@}".OWHS T1 ON T1."WhsCode" = T0."WhsCode"
			
			WHERE (SELECT DISTINCT (SUM(Y."InQty") - SUM(Y."OutQty")) FROM "{?Schema@}".OINM Y 
					WHERE Y."ItemCode" = T2."ItemCode" 
					AND Y."Warehouse" = T1."WhsCode" 
					AND CAST (Y."DocDate" AS DATE) <= {?3_Fecha_Final@}
				) != '0'
			
			ORDER BY T2."ItemCode", T1."WhsCode"
			)T4 ON T0."ItemCode" = T4."ItemCode"
			AND T0."Warehouse" = T4."WhsCode"

WHERE 
T0."Warehouse" BETWEEN {?1_Bodega_Inicial@} AND {?2_Bodega_Final@} 
AND CAST (T0."DocDate" AS DATE) <= {?3_Fecha_Final@}
AND T4."STOCK ACTUAL" > 0 

ORDER BY T0."ItemCode"

Tiene sentido que el costo no este en el campo AvgPrice, vamos a plantear un escenario en el cual se consulta el 2020/12/09:
Tu moneda local es peso mexicano, el producto “A0001” y tienes 2 entradas, la primera el 2020/12/01 (se le asigno el lote “A1/20201201_1”) y la segunda el 2020/12/08 (se le asigno el lote “A1/20201208_1”), el precio en ambos ocasiones es 5 USD la unidad, ambas ocasiones se reciben 10 unidades.
Tipo de cambio día 1 = 20
Tipo de cambio día 8 = 19
+No hay ningún movimiento de stock adicional para para tener casos ideales

*Caso1 - Costeo Promedio
Importe de E1 = (Precio * TC) * Qty = (5 * 20)*10 = 1000
Valor del Stock en E1 = (Precio * TC) * Qty = (5 * 20)*10 = 1000
Costo Unitario en E1 = Valor Stock / Qty = 1000 / 10 = 100

Importe de E2 = (Precio * TC) * Qty = (5 * 19)*10 = 950
Valor del Stock en E2 = (Precio * TC) * Qty = (5 * 19)*10 = 950
Costo Unitario en E2 = Valor Stock / Qty = 950 / 10 = 95

Costo Unitario el día 9 = Valor Total / Qty Total = 1950 / 20 = 97.50 y este el valor que valor que muestra y almacena SAP en AvgPrice (se va calculando basado en cada movimiento)

*Caso 2 - Costo Estandar (se tiene que definir previamente para fines informativos digamos que es a la mitad de acuerdo al punto anterior Costo Estadar = 98)

Importe de E1 = (Precio * TC) * Qty = (5 * 20)*10 = 1000
Valor del Stock en E1 = CostoEstandar * Qty = 98 * 10 = 980
Desviación de Costo en E1 = Importe - valor = 1000 - 980 = 20
Costo Unitario en E1 = Costo Estandar = 98

Importe de E2 = (Precio * TC) * Qty = (5 * 19)*10 = 950
Valor del Stock en E2 = CostoEstandar * Qty = 98 * 10 = 980
Desviación de Costo en E2 = Importe - valor = 950 - 980 = -30
Costo Unitario en E2 = Costo Estandar = 98

Costo Unitario el día 9 = Costo Estandar = 98 y este el valor que valor que muestra y almacena SAP en AvgPrice (NO cambia a menos que se modifique manualmente)

Caso 3 - Costo serie/Lote
Importe de E1 = (Precio * TC) * Qty = (5 * 20)*10 = 1000
Valor del Stock en E1 = (Precio * TC) * Qty = (5 * 20)*10 = 1000
Costo Unitario en E1 = Valor Stock / Qty = 1000 / 10 = 100

Importe de E2 = (Precio * TC) * Qty = (5 * 19)*10 = 950
Valor del Stock en E2 = (Precio * TC) * Qty = (5 * 19)*10 = 950
Costo Unitario en E2 = Valor Stock / Qty = 950 / 10 = 95

Costo Unitario el día 9 = 100 para el lote A1/20201201_1
Costo Unitario el día 9 = 95 para el lote A1/20201208_1
y estos son los valores que SAP mostrara el día 9

Conclusión: En los casos 1 y 2 se necesita solo un campo para almacenar el costo actual, en el Caso 3 puedes tener un costo diferente para cada una de tus series y/o lotes, un solo campo no alcanza. Te sugiero buscar el costo en OBTN/OSRN al ser el dato maestro de Lotes/Series ahí debería estar.

En los 3 casos esos campos almacenan costo actual, si quieres saber el costo en un punto histórico siempre se debe calcular

2 Me gusta

Este tema se cerró automáticamente 30 días después de la última publicación. No se permiten nuevas respuestas.