【问题标题】:Date filter returns an invalid character error日期过滤器返回无效字符错误
【发布时间】:2020-12-23 03:03:30
【问题描述】:

我想在 Access VBA 中使用日期过滤器执行查询。

我的第一个问题是数据类型不一致:预期 DATE 得到 NUMBER。
我假设 Access 将日期存储为数字,就像 Excel 一样。
我发现我必须在查询的日期之间使用“#”才能将其识别为 DATE。现在我收到一个 INVALID CHARACTER 错误,这意味着哈希 # 是无效字符。

我必须与我们的供应商协商后的费用,这些供应商的有效期不超过 60 天。
还有一个 tblVendors,用户可以在其中选择他们想要从中提取信息的供应商 ID (ORDID)。这就是为什么我做一个循环来拉入该表中的每个 ORDID。我不会一次性推入所有的 ORDID,因为它会带来大量数据,并且批量执行会运行得更快。

Sub GetMaterialCost()
    Dim db As Database
    Dim rsData As ADODB.Recordset, rsVendor As DAO.Recordset, rsItemCost As DAO.Recordset
    Dim strQuery As String
    Dim vendorNO As Long, dtDate As Date
        
    Set db = CurrentDb
    dtDate = Format(Now() - 60, "m/d/yyyy")
    Set rsVendor = db.OpenRecordset("SELECT ORDID, VEN_NAME, USER_ID FROM tblVendors WHERE ACTIVE = TRUE ORDER BY VEN_NAME, ORDID")
    Set rsItemCost = db.OpenRecordset("tbl_ItemCost")
          
    ConnectBILL
        
    rsVendor.MoveFirst
    Do Until rsVendor.EOF
            
        strQuery = "SELECT MASID, LOCATION, ITEM, ITEM_QTY, ITEM_UOM, ITEM_COST, EXP_DT " _
          & "FROM ITEMMASTER INNER JOIN ORDDETAIL ON (ITEMMASTER.ITEM = ORDDETAIL.ITEM) " _
          & "WHERE (LOCATION IN (AS1,AS3,AS6) AND TRIM(MASID)  = '" & Cstr(rsVendor.Fields("ORDID")) & "' AND EXP_DT >= @paramDate)"
            
        With ComBill
            .CommandText = strQuery
            Set rsData = .Execute(, Array(dtDate))
        end with    
                   
        'clears previous instance of vendor data by vendor_no if it exists
        db.Execute "DELETE * FROM tbl_ItemCost WHERE MASID LIKE '*" & rsVendor.Fields("ORDID") & "*'"
    
        'starts inserting queried data
        rsData.MoveFirst
        Do Until rsData.EOF
      
            With rsItemCost
                .AddNew
                    
                .Fields("MASID") = rsData!MASID
                .Fields("LOCATION") = rsData!LOCATION
                .Fields("ITEM") = rsData!ITEM
                .Fields("ITEM_UOM") = Trim(rsData!ITEM_UOM)
                .Fields("ITEM_COST") = rsData!ITEM_COST
                .Fields("EXP_DT") = rsData!EXP_DT
                    
                .Update
            End With
                
            rsData.MoveNext
        Loop
          
        rsVendor.MoveNext
    Loop
    
End Sub

【问题讨论】:

  • 您在此处缺少&TRIM(MASID) = '" Cstr(。另外,use parameters。它可以避免这个错误,同时可以更轻松地处理不同语言环境中的日期并避免 SQL 注入。
  • 这里的右括号没有匹配的左括号:#" & dtDate & "#) "。看起来这里有一个孤立的开放括号& Cstr(rsVendor.Fields("ORDID") &。将该行末尾的" 移动到) 之前。
  • @ErikA 我编辑了我的问题并修复了您指出的那些错误。我也会研究一下参数,看来以后会省去很多麻烦。要知道,即使修复了这些错误,无效字符错误仍然存​​在。
  • @knot22,已修复并再次尝试,但问题仍然存在
  • @ErikA,我尝试使用 ADO 参数。但是我在执行EXP_DT >= @paramDateSet rsData = .Execute(, dtDate)时给出了一个缺失的表达式

标签: sql vba ms-access adodb


【解决方案1】:

更正这两行:

dtDate = DateAdd("d", -60, Date)
    
             & "WHERE LOCATION IN (AS1,AS3,AS6) AND TRIM(MASID)  = '" & CStr(rsVendor.Fields("ORDID") & "' AND EXP_DT >= #" & Format(dtDate, "yyyy\/mm\/dd") & "#) "

注意,对于 ADO,日期值的字符串表达式必须使用 ISO 序列格式化。

如果字段EXP_DT 是文本:

             & "WHERE LOCATION IN (AS1,AS3,AS6) AND TRIM(MASID)  = '" & CStr(rsVendor.Fields("ORDID") & "' AND EXP_DT >= '" & Format(dtDate, "m\/d\/yyyy") & "') "

【讨论】:

  • AND EXP_DT >= #2020/07/05# 给出了同样的无效字符错误。我改变了你说的其他内容。 EXP_DT 列的日期为“m/d/yyyy”。
  • 日期时间值不带格式;格式化是为 SQL 中的值创建一个字符串表达式。也许该字段是文本。要么更改(日期应始终存储为 DateTime)或采用。请查看扩展答案。
猜你喜欢
  • 2023-03-16
  • 2018-03-15
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多