Here is
ps: all connections must be opened simultaneously
like
dim adoconnection1 As New ADODB.Connection
dim adoconnection2 As New ADODB.Connection
dim adoconnection3 As New ADODB.Connection
dim rsl As New ADODB.Recordset
dim rs2 As New ADODB.Recordset
dim rs3 As New ADODB.Recordset
cp1 = "Provider=sqloledb;uid=sa;pwd=password;server=servername;database=dbname ;"
Set adoconnection1 = New ADODB.Connection
adoconnection1.CommandTimeout = 2000
adoconnection1.ConnectionTimeout = 10
adoconnection1.Open cp1
Set adoconnection2 = New ADODB.Connection
adoconnection2.CommandTimeout = 2000
adoconnection2.ConnectionTimeout = 10
adoconnection2.Open cp1
Set adoconnection3 = New ADODB.Connection
adoconnection3.CommandTimeout = 2000
adoconnection3.ConnectionTimeout = 10
adoconnection3.Open cp1
gridrow=0
txt1="select ProductID,Description,RetailPrice,CostPrice from Products order by ProductID" 'read every product id
Set rs1 = New ADODB.Recordset
rs1.Open txt1, adoconnection1
While rs1.EOF = False
txt2="select cumstockforprod=sum(UnitsInStock) from StockLevel where ProductID=" & rs1!ProductID
Set rs2 = New ADODB.Recordset
rs2.Open txt2, adoconnection2
cumstockforprod=rs2!cumstockforprod ' get cumulative stock for that product
suminvoicecount=0
sumactualcost=0.0
txt3="select Quantity,CostPrice from Invoices where ProductID=" & rs1!ProductID & " order by InvoiceID desc" ' this part is critical
Set rs3 = New ADODB.Recordset
rs3.Open txt3, adoconnection3
while rs3.eof and suminvoicecount<cumstockforprod
if suminvoicecount+rs3!Quantity <=cumstockforprod then
suminvoicecount=suminvoicecount + rs3!Quantity
sumactualcost=sumactualcost + rs3!quantity*rs3!CostPrice
else
suminvoicecount=suminvoicecount+(cumstockforprod-suminvoicecount) '
sumactualcost=sumactualcost + (cumstockforprod-suminvoicecount)*rs3!CostPrice
end if
rs3.movenext
Wend
' now write to grid or print
gridrow=gridrow+1 '
grid.rows=gridrow+1
grid(gridrow,1).text=rs1!Description
grid(gridrow,2).text=sumactualcost
rs1.MoveNext
Wend