Just check if below gives some guidelines ( The StockIn & StockOut tables are not touched in the below scenario, if Items are returned by an Employee & also there is no StockAvailable Field in the StockOut table) :
Tables
tblItems
Code:
ItemID ItemName ReorderLevel
1 A 50
2 B 100
3 C 200
StockIN
Code:
ReceiptID ItemID DateOfReceipt QtyIn SupplierID
1 1 2/26/2012 10 1
2 1 2/27/2012 20 1
3 1 2/29/2012 10 1
4 1 3/2/2012 5 1
5 2 2/25/2012 20 2
6 2 2/26/2012 30 2
7 2 2/27/2012 40 2
8 2 2/28/2012 50 2
9 2 2/29/2012 60 3
10 2 3/1/2012 70 3
11 3 2/27/2012 80 3
12 3 2/28/2012 90 3
13 3 2/29/2012 100 4
14 3 3/1/2012 110 4
15 3 3/2/2012 120 4
StockOUT
Code:
StockOutID ItemID DateOfIssue QtyIssued EmpIDIssuedTo
1 1 2/27/2012 5 1
2 2 2/28/2012 5 2
3 3 2/29/2012 5 3
4 1 3/1/2012 5 1
5 2 3/2/2012 5 2
6 3 2/27/2012 5 3
7 1 2/28/2012 5 1
8 2 2/29/2012 5 2
9 3 3/1/2012 5 3
10 1 3/2/2012 5 1
11 2 2/27/2012 5 2
12 3 2/28/2012 5 3
13 1 2/29/2012 5 1
14 2 3/1/2012 10 2
15 3 3/2/2012 5 3
16 1 3/2/2012 5 1
tblReturns
Code:
ReturnID ItemID DateOfReturn QtyReturned EmpIDReturnedBy
1 1 2/26/2012 5 1
2 1 2/28/2012 5 1
3 2 2/27/2012 10 1
4 2 2/29/2012 10 2
7 1 3/2/2012 5 3
8 2 3/2/2012 10 3
____________________________
The sub-queries for Available Balance :
qryTotalStockIn
Code:
SELECT
StockIN.ItemID,
Sum(StockIN.QtyIn) AS SumOfQtyIn
FROM
StockIN
GROUP BY
StockIN.ItemID;
The result :
Code:
ItemID SumOfQtyIn
1 45
2 270
3 500
qryTotalStockOut
Code:
SELECT
StockOUT.ItemID,
Sum(StockOUT.QtyIssued) AS SumOfQtyIssued
FROM
StockOUT
GROUP BY
StockOUT.ItemID;
The result :
Code:
ItemID SumOfQtyIssued
1 30
2 30
3 25
qryTotalReturns
Code:
SELECT
tblReturns.ItemID,
Sum(tblReturns.QtyReturned) AS SumOfQtyReturned
FROM
tblReturns
GROUP BY
tblReturns.ItemID;
The result :
Code:
ItemID SumOfQtyReturned
1 15
2 30
The final query for Available balance to be run :
qryAvailableBalance
Code:
SELECT
tblItems.ItemID,
tblItems.ItemName,
tblItems.ReorderLevel,
Nz([SumOfQtyIn],0) AS TotalQtyIn,
Nz([SumOfQtyReturned],0) AS TotalQtyReturned,
Nz([SumOfQtyIssued],0) AS TotalQtyIssued,
Nz([SumOfQtyIn],0)+Nz([SumOfQtyReturned],0)-Nz([SumOfQtyIssued],0) AS CurrentBalance, IIf([CurrentBalance]<=[ReorderLevel],"PlaceOrder","StockLevelOk") AS ReorderStatus
FROM
((tblItems LEFT JOIN qryTotalStockIn ON tblItems.ItemID = qryTotalStockIn.ItemID)
LEFT JOIN
qryTotalReturns ON tblItems.ItemID = qryTotalReturns.ItemID)
LEFT JOIN
qryTotalStockOut ON tblItems.ItemID = qryTotalStockOut.ItemID;
The result :
Code:
ItemID ItemName ReorderLevel TotalQtyIn TotalQtyReturned TotalQtyIssued CurrentBalance ReorderStatus
1 A 50 45 15 30 30 PlaceOrder
2 B 100 270 30 30 270 StockLevelOk
3 C 200 500 0 25 475 StockLevelOk
____________________________
The sub-queries for Employee Balance :
qryEmpItemOut
Code:
SELECT
StockOUT.EmpIDIssuedTo,
StockOUT.ItemID,
Sum(StockOUT.QtyIssued) AS SumOfQtyIssued
FROM
StockOUT
GROUP BY
StockOUT.EmpIDIssuedTo,
StockOUT.ItemID;
The result
Code:
EmpIDIssuedTo ItemID SumOfQtyIssued
1 1 30
2 2 30
3 3 25
qryEmpItemReturned
Code:
SELECT
tblReturns.EmpIDReturnedBy,
tblReturns.ItemID,
Sum(tblReturns.QtyReturned) AS SumOfQtyReturned
FROM
tblReturns
GROUP BY
tblReturns.EmpIDReturnedBy,
tblReturns.ItemID;
The result :
Code:
EmpIDReturnedBy ItemID SumOfQtyReturned
1 1 10
1 2 10
2 2 10
3 1 5
3 2 10
The final query to be run for Employee Items Balance to be returned :
qryEmpItemIssuedReturned
Code:
SELECT
qryEmpItemOut.EmpIDIssuedTo,
qryEmpItemOut.ItemID,
qryEmpItemOut.SumOfQtyIssued,
qryEmpItemReturned.EmpIDReturnedBy,
qryEmpItemReturned.ItemID,
qryEmpItemReturned.SumOfQtyReturned,
[SumOfQtyIssued]-Nz([SumOfQtyReturned],0) AS BalanceWithEmp
FROM
qryEmpItemOut
LEFT JOIN
qryEmpItemReturned
ON
(qryEmpItemOut.EmpIDIssuedTo = qryEmpItemReturned.EmpIDReturnedBy)
AND
(qryEmpItemOut.ItemID = qryEmpItemReturned.ItemID);
The result :
Code:
EmpIDIssuedTo qryEmpItemOut.ItemID SumOfQtyIssued EmpIDReturnedBy qryEmpItemReturned.ItemID SumOfQtyReturned BalanceWithEmp
1 1 30 1 1 10 20
2 2 30 2 2 10 20
3 3 25 25
Thanks