微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问VBA-日期作为过滤器的SQL ADODB记录集会变成无效的字符错误

如何解决访问VBA-日期作为过滤器的SQL ADODB记录集会变成无效的字符错误

在访问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

解决方法

更正这两行:

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,AS6) AND TRIM(MASID)  = '" & CStr(rsVendor.Fields("ORDID") & "' AND EXP_DT >= '" & Format(dtDate,"m\/d\/yyyy") & "') "

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。