【发布时间】: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)时给出了一个缺失的表达式