0

「No Current Record」を過ぎて「Item」=「Item」である次のレコードに移動するにはどうすればよいですか

ループが戻ってきて、rsSO で Sales Order レコードを見つけますが、rsInv または Inventory レコードセットでは見つけず、「レコードが見つかりませんエラー」を作成します。その理由は、在庫をオープン セールス オーダーに割り当てて枯渇させた後、その特定のアイテムの在庫レコードを削除しても、そのアイテムのオープン セールス オーダーが残っている可能性があるためです。rsInv で在庫がなくなったら、Open Sales Order rsSO レコードセットの次のアイテムに移動するにはどうすればよいですか?

最初のループ内のコードの次のセクションで発生しています。

     Do Until rsInv!Item = rsSO!Item
       If rsInv!Item = rsSO!Item Then
       Exit Do
       Else
       rsInv.MoveNext
       End If
    Loop

コード全体:

Public Function UpdateInventoryIntl()

Dim rsInv As DAO.Recordset, rsSO As DAO.Recordset, db As DAO.Database
Dim qdf As DAO.QueryDef
Dim AllocationQty As Long, SaleOrderRemainder As Long
Set db = CurrentDb

    Set rsInv = CurrentDb.OpenRecordset( _
            "SELECT * FROM [tbl_InventoryAvailForIntl] ORDER BY [Item] DESC,[QOH_IntlAllocation] DESC", _
            dbOpenDynaset)

    Set rsSO = CurrentDb.OpenRecordset("SELECT * FROM [tbl_IntlAllocated] ORDER BY [Item] DESC,[Qty_Open] DESC", _
            dbOpenDynaset)


    Do Until rsSO.RecordCount = 0

             Do Until rsInv!Item = rsSO!Item
               If rsInv!Item = rsSO!Item Then
               Exit Do
               Else
               rsInv.MoveNext
               End If
            Loop


        AllocationQty = IIf(rsSO!Qty_Open > rsInv!QOH_IntlAllocation, rsInv!QOH_IntlAllocation, rsSO!Qty_Open)

        db.Execute ("INSERT INTO tbl_IntlAllocatedResults (Due_Date, Sale_Order_Num, SO_Line, Item, Qty_OpenStart, Location, Lot, QtyAllocated) " & _
        "VALUES (#" & rsSO!Due_Date & "#,'" & rsSO!Sale_Order_Num & "'," & rsSO!SO_Line & ",'" & rsSO!Item & "'," & rsSO!Qty_OpenStart & ",'" & rsInv!Location & "','" & rsInv!Lot & "'," & AllocationQty & ");")

        rsSO.Edit
        rsSO!Qty_Open = rsSO!Qty_Open - AllocationQty
        rsSO.Update

        If rsSO!Qty_Open = 0 Then
        rsSO.Delete
        rsSO.MoveNext
        End If

        rsInv.Edit
        rsInv!QOH_IntlAllocation = rsInv!QOH_IntlAllocation - AllocationQty
        rsInv.Update
        Debug.Print rsInv!QOH_IntlAllocation

        If rsInv!QOH_IntlAllocation = 0 Then
        rsInv.Delete
        rsInv.MoveNext
        End If

    Loop

rsSO.Close
Set rsSO = Nothing
Set qdf = Nothing
rsInv.Close
Set rsInv = Nothing

End Function
4

1 に答える 1

0

レコードセットを循環するのではなく、FindFirst を使用します。

Dim sCriteria as String

sCriteria = "Item = " & rsSO!Item
rsInv.FindFirst (sCriteria)
If rsInv.NoMatch Then
    ' Do whatever you need to if there is no inventory
Else
    ' Carry on with your code
End If

レコードセットのサイズによっては、必要に応じてレコードセットをピックアップする効率が向上する場合があります。

問題のあるループの代わりに、最初に rsInv を設定しないでください。

Set rsInv = Currentdb.OpenRecordset( _
    "SELECT * FROM [tbl_InventoryAvailForIntl] _
        WHERE [Item] = " & rsSO!Item & " ORDER BY [QOH_IntlAllocation] DESC", _
        dbOpenDynaset)

次に、レコードがないかどうかをテストできます。

If rsInv.EOF and rsInv.BOF Then
    ' No records, do what is required when no inventory
End If
于 2013-11-05T00:38:30.673 に答える