我想将SQL查询应用于一个Access表,从该表中检索另一个Access文件中的表的数据。我已经浏览了这个主题,似乎无法找到解决方案。
基于此来源http://support.microsoft.com/kb/113701,我想出了以下内容,但仍然没有运气。
sSQL = "UPDATE TableInCurrentDB
SET [Field1InCurrentDB]= DAvg('Field1InExternalDB','[;database=C:\VB\ExternalDB.accdb].[TableInExternalDB]','Field2InExternalDB= & Year(Now()) & ')
WHERE [Field2InCurrentDB]='1';"
DoCmd.RunSQL sSQL
我知道错误位于对外部数据库的引用中,因为如果表位于同一个数据库中,代码可以正常工作。但是,很难确切地说出错误是什么,因为我得到的错误是“未知”。
如何修改此语句以从另一个Access数据库的表更新Access表?
答案 0 :(得分:1)
您不希望在外部数据库中使用指向该表的链接,但是当您想要使用DAvg
时,该选择会很复杂。但是,由于您使用VBA代码执行此操作,因此您可以放弃DAvg
并按两个步骤执行所需操作:
UPDATE
。对于步骤#1,请在Access查询设计器中将其作为新查询进行测试...
SELECT Avg(Field1InExternalDB)
FROM TableInExternalDB IN 'C:\VB\ExternalDB.accdb'
WHERE Field2InExternalDB=Year(Date());
假设查询返回正确的值,请调整您的VBA代码以检索相同的值。
Dim db As DAO.database
Dim strSelect As String
Dim varAvg As Variant
strSelect = "SELECT Avg(Field1InExternalDB)" & vbCrLf & _
"FROM TableInExternalDB IN 'C:\VB\ExternalDB.accdb'" & vbCrLf & _
"WHERE Field2InExternalDB=Year(Date());"
'Debug.Print strSelect
Set db = CurrentDb
varAvg = db.OpenRecordset(strSelect)(0)
Debug.Print Nz(varAvg, 0) ' see note
请注意,如果没有行包含与当前年份匹配的Field2InExternalDB
值,则查询将返回Null。这就是varAvg
被声明为Variant
的原因。稍后Nz(varAvg, 0)
会给你零而不是空。
然后,您可以对UPDATE
使用参数查询,并提供Nz(varAvg, 0)
作为参数值。
Dim qdf As DAO.QueryDef
Dim strUpdate As String
strUpdate = "UPDATE TableInCurrentDB" & vbCrLf & _
"SET [Field1InCurrentDB]=[pAvg]" & vbCrLf & _
"WHERE [Field2InCurrentDB]='1';"
'Debug.Print strUpdate
Set qdf = db.CreateQueryDef(vbNullString, strUpdate)
qdf.Parameters("pAvg") = Nz(varAvg, 0)
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing
答案 1 :(得分:0)
你能不能一步到位吗?将第一个SQL的输出作为输入合并到第二个“
中的”set“换句话说,绕过第一个查询,然后使用它作为“strUpdate”字符串执行第二个查询:
strUpdate = "UPDATE TableInCurrentDB" & vbCrLf & _
"SET [Field1InCurrentDB]=" & vbCrLf & _
" (SELECT Val(Nz(Avg(Field1InExternalDB),0))" & vbCrLf & _
" FROM TableInExternalDB IN 'C:\VB\ExternalDB.accdb'" & vbCrLf & _
" WHERE Field2InExternalDB=Year(Date()) )" & vbCrLf & _
"WHERE [Field2InCurrentDB]='1';"