2014-03-28 55 views
1

我需要记录集搜索条件的帮助,该条件会给我一个类型不匹配错误。下面的代码段:MS ACCESS VBA记录集搜索条件类型不匹配

'Set search criteria from SO recordset 

sCriteria = "Item = " & rsSO!Item & " And Expire >= " & rsSO!Expire 

rsSO!Item is Text 

rsSO!Expire is Number 

我试过使用Variant而不是String。它没有工作

我不能在搜索标准字符串中使用> =吗?

我试图通过销售订单记录集并使用物料代码和过期编号循环查找库存记录集中的任何可用库存,并将其分配到结果表中,将其分配给销售订单。

挂断搜索条件类型不匹配。

Public Function UpdateInventoryIntl() 
    Dim rsInv As DAO.Recordset, rsSO As DAO.Recordset, rsItems As DAO.Recordset, db As DAO.Database 
    Dim qdf As DAO.QueryDef 
    Dim sCriteria As String 
    Dim AllocationQty As Long, SaleOrderRemainder As Long 
    Set db = CurrentDb 

      'Inventory by LOT FIFO through [Expire] ASC 
      '========================================== 
      Set rsInv = CurrentDb.OpenRecordset(_ 
      "SELECT * FROM [tbl_InventoryAvailForIntl] ORDER BY [Item] DESC,[Expire] ASC", _ 
      dbOpenDynaset) 

      'Need to add expiry date requirement to SO table by item by geo 
      '=============================================================== 
      Set rsSO = CurrentDb.OpenRecordset("SELECT * FROM [tbl_IntlAllocated] ORDER BY [Item] DESC,[Due_Date] ASC ,[Expire] DESC", _ 
      dbOpenDynaset) 


    Do Until rsSO.RecordCount = 0 

    'Set search criteria from SO recordset 
    '===================================== 
    sCriteria = "Item = " & rsSO!Item & " And Expire >= " & rsSO!Expire 

    'Find first SO criteria in the Inventory recordset 
    '================================================= 
    rsInv.FindFirst (sCriteria) 

    If rsInv.NoMatch Then 
    'Delete SO because there is no inventory and go to next SO 
    rsSO.Delete 
    rsSO.MoveNext 

    Else 
     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 

     If rsInv!QOH_IntlAllocation = 0 Then 
     rsInv.Delete 
     rsInv.MoveNext 
      If rsSO.RecordCount = 0 Then 
      Exit Do 
      End If 
       If rsInv!Item <> rsSO!Item Then 
       Debug.Print rsSO!Item 
       db.Execute ("DELETE tbl_IntlAllocated.* FROM tbl_IntlAllocated WHERE Item = '" & rsSO!Item & "';") 
       Set rsSO = CurrentDb.OpenRecordset("SELECT * FROM [tbl_IntlAllocated] ORDER BY [Item] DESC,[Due_Date] DESC", _ 
       dbOpenDynaset) 
       End If 
     End If 
    End If 

    Loop 

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

End Function 

回答

3

我认为expire是一个日期和item是一个字符串。唯一不需要任何类型的“机箱”的数据类型是数字。需要将日期放入#,并且需要将字符串包装在'中。

sCriteria = "Item = '" & rsSO!Item & "' And Expire >= #" & Format(rsSO!Expire, "yyyy-mm-dd") & "#" 

由于Remou的评论,我更新了日期的比较方式,所以没有潜在的歧义。

+1

将日期格式设置为yyyy-mm-dd以避免出现语言环境问题可能是个想法。 – Fionnuala

+0

@Remou你会格式化? SQL字段的记录集字段?或两者? “CDate”能解决这种问题吗?是不是locale问题仅仅是因为'rsSO!Expire'会在连接之前被转换为字符串,但不是如何将这个转换形成为区域设置的函数?它不会选择正确吗? – Brad

+1

是的,rsSO!Expire会被转换为一个字符串,所以如果你的语言环境在美国之外,你可能会得到'dd/mm/yyyy',这是行不通的,Access需要明确的日期和年份,月份,一天是相当明确的。如果您使用'&format(rsSO!Expire,“yyyy/mm/dd”)&'或'&format(rsSO!Expire,“yyyy-mm-dd”)&',您将会安全。 – Fionnuala