The following script shows the stock level of an item at a location at any particular date using non-HITB history tables.
You should be able to tweak the query to get the quantity variances between months.
DECLARE
@LOCATION varchar(11) = 'WAREHOUSE',
@ITEMNMBR varchar(31) = '128 SDRAM',
@Module VARCHAR(10),
@Type INT,
@DocNo VARCHAR(50),
@DocDate DATETIME,
@TrxQty FLOAT,
@OnHand FLOAT,
@Allocated FLOAT,
@From VARCHAR(50),
@To VARCHAR(50),
@Customer VARCHAR(50),
@CustomerName VARCHAR(100),
@Posted INT,
@DEX_ROW_ID INT
SELECT @Allocated = ATYALLOC, @OnHand = QTYONHND FROM IV00102 WHERE ITEMNMBR = @ITEMNMBR AND LOCNCODE = @LOCATION
CREATE TABLE #Temp
(
[Doc Date] DATETIME,
[Module] VARCHAR(10),
[Type] INT,
[Doc No] VARCHAR(50),
[Trx Qty] FLOAT,
[On Hand] FLOAT,
[Allocated] FLOAT,
[From] VARCHAR(50),
[To] VARCHAR(50),
[Customer] VARCHAR(50),
[Customer Name] VARCHAR(100),
[Posted] INT,
[DEX_ROW_ID] INT
)
DECLARE History_Cursor CURSOR FOR
-- Unposted invoices
SELECT
SOP10100.DOCDATE AS [DocDate],
'SOP' AS Module,
SOP10100.SOPTYPE AS [Type],
SOP10100.SOPNUMBE AS [DocNo],
SOP10200.QUANTITY AS [TrxQty],
SOP10200.LOCNCODE AS [From],
'' AS [To],
SOP10100.CUSTNMBR AS [Customer],
RM00101.CustName as [CustomerName],
0 as Posted,
SOP10100.DEX_ROW_ID
FROM SOP10200 AS SOP10200
INNER JOIN SOP10100 AS SOP10100 ON SOP10200.SOPNUMBE = SOP10100.SOPNUMBE
INNER JOIN RM00101 AS RM00101 ON SOP10100.CUSTNMBR = RM00101.CUSTNMBR
WHERE SOP10200.LOCNCODE = @LOCATION
AND SOP10200.ITEMNMBR = @ITEMNMBR
UNION
-- Unposted transfers and assemblies
SELECT
IV10000.DOCDATE AS [Doc Date],
'IV' AS Module,
IV10001.IVDOCTYP AS Type,
IV10001.IVDOCNBR AS [Doc No.],
IV10001.TRXQTY AS [TrxQty],
IV10001.TRXLOCTN AS [From],
IV10001.TRNSTLOC AS [To],
'' AS [Customer],
'' AS [Customer Name],
0 AS Posted,
IV10001.dex_row_id
FROM IV10001 AS IV10001
INNER JOIN IV10000 AS IV10000 ON IV10001.IVDOCNBR = IV10000.IVDOCNBR
WHERE IV10001.TRXLOCTN = @LOCATION AND IV10001.ITEMNMBR = @ITEMNMBR
UNION
-- Posted Invoices and non transfer
SELECT
IV30300.DOCDATE AS [DocDate],
IV30300.HSTMODUL AS Module,
IV30300.DOCTYPE AS [Type],
IV30300.DOCNUMBR AS [DocNo],
IV30300.TRXQTY AS [TrxQty],
IV30300.TRXLOCTN AS [From],
'' AS [To],
IV30300.CUSTNMBR AS [Customer],
CASE
WHEN RM00101.CUSTNMBR IS NOT NULL THEN RM00101.CUSTNAME
WHEN PM00200.VENDORID IS NOT NULL THEN PM00200.VENDNAME
ELSE '' END
AS [CustomerName],
1 AS Posted,
IV30300.DEX_ROW_ID
FROM IV30300 AS IV30300
LEFT JOIN RM00101 AS RM00101 ON IV30300.CUSTNMBR = RM00101.CUSTNMBR
LEFT JOIN PM00200 AS PM00200 ON IV30300.CUSTNMBR = PM00200.VENDORID
WHERE
IV30300.DOCTYPE <> 3
AND IV30300.TRXLOCTN = @LOCATION
AND IV30300.ITEMNMBR = @ITEMNMBR
UNION
-- Posted Transfers
SELECT
IV30300.DOCDATE AS [DocDate],
IV30300.HSTMODUL AS Module,
IV30300.DOCTYPE AS [Type],
IV30300.DOCNUMBR AS [DocNo],
-IV30300.TRXQTY AS [TrxQty],
'' AS [From],
IV30300.TRNSTLOC AS [To],
IV30300.CUSTNMBR AS [Customer],
'' AS [CustomerName],
1 AS Posted,
IV30300.DEX_ROW_ID
FROM
IV30300 AS IV30300
WHERE
IV30300.DOCTYPE = 3
AND IV30300.TRXLOCTN = @LOCATION
AND IV30300.ITEMNMBR = @ITEMNMBR
UNION
-- Posted transfers
SELECT
IV30300.DOCDATE AS [DocDate],
IV30300.HSTMODUL AS Module,
IV30300.DOCTYPE AS [Type],
IV30300.DOCNUMBR AS [DocNo],
IV30300.TRXQTY AS [TrxQty],
IV30300.TRXLOCTN AS [From],
'' AS [To],
IV30300.CUSTNMBR AS [Customer],
'' AS [CustomerName],
1 AS Posted,
IV30300.DEX_ROW_ID
FROM
IV30300 AS IV30300
WHERE
IV30300.DOCTYPE = 3
AND IV30300.ITEMNMBR = @ITEMNMBR
AND IV30300.TRNSTLOC = @LOCATION
ORDER BY Posted, DOCDATE DESC, [Quantity]
OPEN History_Cursor
FETCH NEXT FROM History_Cursor INTO @DocDate, @Module, @Type, @DocNo, @TrxQty, @From, @To, @Customer, @CustomerName, @Posted, @DEX_ROW_ID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #Temp SELECT @DocDate, @Module, @Type, @DocNo, @TrxQty, @OnHand, @Allocated, @From, @To, @Customer, @CustomerName, @Posted, @DEX_ROW_ID
IF @Posted = 1
SET @OnHand = @OnHand - @TrxQty
IF @Posted = 0
BEGIN
IF CASE WHEN (@Module = 'IV' AND @Type IN (1,2,3)) THEN 0 ELSE 1 END = 1
AND CASE WHEN (@Module = 'SOP' AND @Type IN (4, 5)) THEN 0 ELSE 1 END = 1
SET @Allocated = @Allocated - @TrxQty
END
FETCH NEXT FROM History_Cursor INTO @DocDate, @Module, @Type, @DocNo, @TrxQty, @From, @To, @Customer, @CustomerName, @Posted, @DEX_ROW_ID
END
CLOSE History_Cursor
DEALLOCATE History_Cursor
SELECT * FROM #Temp
DROP TABLE #Temp