Saldo de Inventario con Corte de Fecha (mes)

Estimados

Quisiera Solicitar su ayuda y experiencia con una Query, necesitamos crear una consulta en SAP 9.3 la cual contenga
Código de Artículo, Nombre de Artículo, Unidad de Medida, Saldo en Stock, Fecha Contable (fecha Corte), Entradas, Salidas, Precio Costo ( de la transacción) , Código Almacén, Nombre de almacén, Grupo de Artículo
usando un filtro de fecha desde hasta para poder sacar por mes, ejemplo: 01-01-2023 al 31-01-2023

desde ya muchas gracias

Hola buenas, si nos compartes lo que hayas podido realizar para ver si se te puede ayudar, sería de gran utilidad.
Por otro lado, ¿has utilizado el buscador?, seguro que hay alguna solución aproximada o parecida que te pueda aportar o servir.

Estimado @meqs Muchas gracias por la pronta respuesta.

Lo que obtuve mirando muchas parte es esto, le agregue la unidad de medida, pero aun debo agregar el almacén y el precio de costo, junto con las fechas de las transacciones.
lo que se desea realizar en la empresa es un Análisis de lo consumido mensual, y como se comporta en base al mes anterior (muy parecido al auditoria de stock pero aún más detallado)

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
    [Artículo] = t1.itemcode,
    [Desc. Artículo] = t1.ItemName,
    [Unidad de Medida] = t1.InvntryUom,
    [Stock inicial] = ISNULL(COALESCE(t0.saldoinic, 0), 0),
    [Entradas] = ISNULL(t1.entradas, 0),
    Consumo = ISNULL(t1.consumo, 0),
    [Consumo medio diario] = ISNULL(t1.consumo / DATEDIFF(day, @dataInicio, @dataFinal), 0),
    [Stock final] = ISNULL(COALESCE(t0.saldoinic, 0) + COALESCE(t1.saldofin, 0), 0),
    [Stock promedio] = ISNULL((COALESCE(t0.saldoinic, 0) + (COALESCE(t0.saldoinic, 0) + t1.saldofin)) / 2, 0),
    [Rotación stock] = CASE
        WHEN ISNULL((COALESCE(t0.saldoinic, 0) + (COALESCE(t0.saldoinic, 0) + t1.saldofin)) / 2, 0) = 0 THEN 0
        ELSE ISNULL(t1.consumo / ((COALESCE(t0.saldoinic, 0) + (COALESCE(t0.saldoinic, 0) + t1.saldofin)) / 2), 0)
    END,
    [Cobertura de stock] = CASE
        WHEN ISNULL(COALESCE(t1.consumo / DATEDIFF(day, @dataInicio, @dataFinal), 0), 0) = 0 THEN 0
        ELSE ISNULL(((COALESCE(t0.saldoinic, 0) + (COALESCE(t0.saldoinic, 0) + t1.saldofin)) / 2) / (t1.consumo / DATEDIFF(day, @dataInicio, @dataFinal)), 0)
    END
FROM 
(
    SELECT
        a1.itemcode,
        a1.ItemName,
        a1.InvntryUom,
        saldoInic = ISNULL(SUM(COALESCE(s1.Inqty, 0)) - SUM(COALESCE(s1.outqty, 0)), 0)
    FROM OITM a1
    JOIN OINM s1 ON a1.itemcode = s1.itemcode
    WHERE s1.docdate < @dataInicio
    GROUP BY
        a1.itemcode,
        a1.ItemName,
        a1.InvntryUom
) 
AS t0
INNER JOIN (
    SELECT
        a.itemcode,
        a.ItemName,
        a.InvntryUom,
        entradas = ISNULL(SUM(s.Inqty), 0),
        consumo = ISNULL(SUM(s.outqty), 0),
        saldoFin = ISNULL(SUM(s.Inqty) - SUM(s.outqty), 0)
    FROM OINM s
    JOIN OITM a ON a.itemcode = s.itemcode
    WHERE s.docdate BETWEEN @dataInicio AND @dataFinal
    GROUP BY
        a.itemcode,
        a.ItemName,
        a.InvntryUom
) t1 ON t1.itemcode = t0.itemcode

1 me gusta

Podrías considerar las siguientes tablas y campos:

  1. Tabla OITM (Maestro de artículos): Aquí puedes encontrar los campos ItemCode (Código de Artículo) y ItemName (Nombre de Artículo).
  2. Tabla OITW (Saldos de almacén): Esta tabla contiene los campos OnHand (Saldo en Stock), AvgPrice (Precio Costo), y WhsCode (Código de Almacén).
  3. Tabla OWHS (Maestro de almacenes): Aquí puedes encontrar el campo WhsName (Nombre de Almacén).
  4. Tabla OITB (Grupos de artículos): Esta tabla contiene el campo ItmsGrpNam (Grupo de Artículo).
  5. Tabla OUGV (Unidades de medida de grupo): Aquí puedes encontrar el campo UgpEntry (Unidad de Medida).
  6. Tabla OINM (Movimientos de stock): Esta tabla contiene los campos DocDate (Fecha Contable), InQty (Entradas), OutQty (Salidas), y Price (Precio de la transacción).

Saludines

Para agregar el almacén, el precio de costo y las fechas de las transacciones a tu consulta, podrías considerar lo siguiente:

  1. Agregar el campo WhsCode (Código de Almacén) y Price (Precio de la transacción) de la tabla OINM a tu subconsulta t1.
  2. Unir la tabla OITW en tu consulta principal para obtener el campo AvgPrice (Precio Costo).
  3. Unir la tabla OWHS en tu consulta principal para obtener el campo WhsName (Nombre de Almacén).

Algo así:

-- ... (tu consulta) ...

-- Agrégale el WhsCode y el Price a tu subconsulta t1
SELECT
    a.itemcode,
    a.ItemName,
    a.InvntryUom,
    s.WhsCode,  
    s.Price,  
    entradas = ISNULL(SUM(s.Inqty), 0),
    consumo = ISNULL(SUM(s.outqty), 0),
    saldoFin = ISNULL(SUM(s.Inqty) - SUM(s.outqty), 0)
FROM OINM s
JOIN OITM a ON a.itemcode = s.itemcode
WHERE s.docdate BETWEEN @dataInicio AND @dataFinal
GROUP BY
    a.itemcode,
    a.ItemName,
    a.InvntryUom,
    s.WhsCode,  
    s.Price  
) t1 ON t1.itemcode = t0.itemcode

-- Une las tablas OITW y OWHS para obtener AvgPrice y WhsName
JOIN OITW w ON t1.itemcode = w.ItemCode AND t1.WhsCode = w.WhsCode
JOIN OWHS h ON t1.WhsCode = h.WhsCode

-- ... (lo que sigue de tu consulta) ...

Solo es una idea, espero que te pueda servir.

Saludines

1 me gusta

Muchas Gracias, la verdad así lo había sacado, el problema es que el Onhand trae el stock actual solamente, y no el del corte de la fecha, le daré otra vuelta a la query

¡Ah! es que para obtener el saldo de una fecha específica, debes considerar el calcularlo a partir de los movimientos de stock hasta esa fecha. Eso implica sumar todas las entradas y restar todas las salidas hasta la fecha de corte.

Algo así:

SELECT
    a.itemcode,
    a.ItemName,
    a.InvntryUom,
    s.WhsCode,  
    s.Price,  
    saldoCorte = ISNULL(SUM(s.Inqty) - SUM(s.outqty), 0)  -- Stock en la fecha de corte que necesitas
FROM OINM s
JOIN OITM a ON a.itemcode = s.itemcode
WHERE s.docdate <= @dataCorte  -- Acuérdate de cambiar @dataCorte a tu fecha de corte
GROUP BY
    a.itemcode,
    a.ItemName,
    a.InvntryUom,
    s.WhsCode,  
    s.Price  
) t1 ON t1.itemcode = t0.itemcode



2 Me gusta

no logro sacar el informe como se desea, siempre encuentros datos aislados

Hola Renato,
No sé si a este tiempo ya resolviste tu problema, pero te comento como lo resolví, si bien no soy un experto como ustedes en power query, si lo pude resolver en power bi:
Primero fui a buscar las tablas OINM, OITB y OITM;
Luego uní las tablas OITM con OINM con la columna “Item Code” (Esto lo hice ya que algunos nombres estaba repetidos o escritos de forma errónea en la tabla OINM)
y luego uní las tablas OITM y OITB con las columnas “ItmsGrpCod” (que es la columna donde aparece el nombre del grupo del inventario)
Ahora para hacer la visualización de los datos, hice lo siguiente:
Código de Artículo (ItemCode[OITM]), Nombre del Artículo (ItemName[OITM]), Unidad de Medida (InvntryUom[OITM]), Saldo en Stock (Diferencia de Entradas (InQty[OINM])- Salidas (OutQty[OINM]), Fecha Contable (DocDate [OINM]), Precio Costo (TransValue[OINM]), Grupo de Artículo (ItmsGrpNam[OITB]).
Cabe mencionar que con algunas medidas extras, power bi me entregó todos los datos que le solicité como es el stock valorizado a una fecha especifica por grupo de artículos y además por cuenta contable (esto para verificar que el monto del inventario valorizado, este correcto).
Espero que el nombre de las tablas te ayude o te guíe de alguna forma.
Saludos.