如何解决访问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 举报,一经查实,本站将立刻删除。