通过Access VBA按顺序更新库存值

时间:2013-10-25 18:31:43

标签: loops ms-access multidimensional-array access-vba

我需要按批次#-Location从库存表中减去安全库存,最好的数量一直到安全库存耗尽。

我可以拥有多个具有不同批次#位置数量组合的库存商品。

唯一的关系是物品编号

我认为我错误的是减去安全库存然后更新库存表的循环。如果有更好的方法,请告诉我。

非常感谢任何帮助。

Item       Safety_Stock
011901              917

Item         Location   Lot          QOH
011901       PR501106   REXI0474    3325
011901       pp46321b   REXI0474     475
Public Function InventoryUpdate()
Dim intTot As Long
Dim i As Integer
Dim i2 As Integer
Dim loopCounter As Integer

'Assign recordsets

'Define recordset to get expected SS data
Dim rsSS As DAO.Recordset
Set rsSS = Currentdb.OpenRecordset("SELECT * FROM tbl_ItemxSS")

'Define recordset to get Inventory data
'Inventory records ID, Site, PL, Item, Desc, Location, Lot, QOH, QtyAlloc, Created, Expire, Status
Dim rsInv As DAO.Recordset
Set rsInv = Currentdb.OpenRecordset("SELECT * FROM tbl_Inventory")

' get rsSS.recordcount and go back to the beginning
rsSS.MoveLast
rsSS.MoveFirst
'Debug.Print rsSS.RecordCount


' Need to update Inventory records returned by subtracting SS 
Dim RA() As Variant
ReDim RA(0 To rsSS.RecordCount - 1, 0 To 1)

' Populate the array with the SS data
i = 0
Do Until rsSS.EOF
'Debug.Print rsSS.Fields(0)
'Debug.Print rsSS.Fields(1)
    RA(i, 0) = rsSS!Item
    RA(i, 1) = rsSS!Safety_Stock

    If rsSS.RecordCount <> 0 Then
        rsSS.MoveNext
        i = i + 1

    End If
Loop

intTot = 0
loopCounter = 0 ' This will ensure we don't check transactions more than once

Do Until rsInv.EOF
Debug.Print rsInv.Fields(3)
 Debug.Print rsInv.Fields(7)

    If intTot < rsInv!QOH Then                      'if 0 is less than QOH
        For i = loopCounter To UBound(RA)           'Loop through SS array one by one
            intTot = intTot + RA(i, 1)              'Initialize intTot to be SS Qty
            If intTot <= rsInv!QOH Then             'If SS Qty <= QOH
                rsInv.Edit                          'Edit Inventory Table
                rsInv!QOH = rsInv!QOH - intTot      'Subtract SS from QOH
                rsInv.Update                        'Update that QOH's with new Qty
                intTot = 0                          'Reset SS qty to 0 since it was all allocated
                loopCounter = loopCounter + 1       'increase this so we don't double check a transaction
                Exit For ' exit loop and move to the next SS Qty
            End If
        Next i
    Else
        rsInv.Edit
        rsInv!QOH = rsInv!QOH
        rsInv.Update
        intTot = intTot - rsInv!QOH
    End If
    If rsInv.RecordCount <> 0 Then
        rsInv.MoveNext
    End If
Loop
End Function

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

  1. 正如您在上次评论中提到的那样,您在两个表之间的[项目]上不匹配,因此您的表格更新不一定适用于正确的项目。
  2. rsInv的SELECT语句不包含ORDER BY子句,因此您不会根据谁拥有最多来处理库存记录。
  3. 无需将rsSS中的值转储到数组中并循环遍历数组;只需遍历Recordset本身。
  4. 总的来说,你的代码比它需要的更复杂。
  5. Dim rsSS As DAO.Recordset, rsInv As DAO.Recordset
    Dim qdf As DAO.QueryDef
    Dim intTot As Long, intReduction As Long
    
    Set rsSS = CurrentDb.OpenRecordset( _
            "SELECT * FROM [tbl_ItemxSS]", _
            dbOpenSnapshot)
    Set qdf = CurrentDb.CreateQueryDef("", _
            "SELECT * FROM [tbl_Inventory] " & _
            "WHERE [Item]=[pCurrentItem] " & _
            "ORDER BY [QOH] DESC")
    Do Until rsSS.EOF
        intTot = rsSS!Safety_Stock
        qdf!pCurrentItem = rsSS!Item  ' set query parameter for this iteration
        Set rsInv = qdf.OpenRecordset(dbOpenDynaset)
        Do Until rsInv.EOF
            intReduction = IIf(rsInv!QOH > intTot, intTot, rsInv!QOH)
            rsInv.Edit
            rsInv!QOH = rsInv!QOH - intReduction
            rsInv.Update
            intTot = intTot - intReduction
            If intTot = 0 Then
                Exit Do
            End If
            rsInv.MoveNext
        Loop
        rsInv.Close
        Set rsInv = Nothing
        rsSS.MoveNext
    Loop
    Set qdf = Nothing
    rsSS.Close
    Set rsSS = Nothing