基于查询值在VBA中运行Update Qry
我试图在VBA中运行一个更新查询,但我不知道应该为代码编写什么。我正在运行一个查询以从表中查找最近的日期。这个查询很有效。现在我想运行一个更新查询,将另一个表的日期字段更新为与查询的日期相同。以下是我所拥有的:基于查询值在VBA中运行Update Qry,vba,ms-access,Vba,Ms Access,我试图在VBA中运行一个更新查询,但我不知道应该为代码编写什么。我正在运行一个查询以从表中查找最近的日期。这个查询很有效。现在我想运行一个更新查询,将另一个表的日期字段更新为与查询的日期相同。以下是我所拥有的: Dim Date1 As Date Dim newdate1 'selects datadate 1 Date1 = CurrentDb.OpenRecordset("Select Max(Date1_Event) from TBL_Event WHERE ID = '" &
Dim Date1 As Date
Dim newdate1
'selects datadate 1
Date1 = CurrentDb.OpenRecordset("Select Max(Date1_Event) from TBL_Event WHERE ID = '" & [Forms]![FRM_Main]![ID] & "'")(0)
'update datadate 1
newdate1 = CurrentDb.OpenRecordset("Update Tbl_Name set CollectionDate = DataDate1 WHERE PID = '" & [Forms]![FRM_Main]![ID] & "'")(0)
有没有办法像这样运行更新查询?多谢各位 操作查询(DELETE
,UPDATE
,INSERT-INTO
)将被执行(CurrentDb.Execute
),而SELECT
查询将作为记录集打开(CurrentDb.OpenRecordset
)
另外,考虑使用参数化来避免在查询中需要引用外壳或字符串连接。这里的最大日期是使用域聚合计算的,
DMax()
,而不是打开另一个查询
Dim strSQL As String
Dim qdef As Querydef
' PREPARE SQL STATEMENT
strSQL = "PARAMETERS [MaxDateParam] Date, [FormIDParam] Long;" _
& "UPDATE Tbl_Name SET CollectionDate = [MaxDateParam]" _
& " WHERE PID = [FormIDParam];"
' BUILD TEMP QUERY
Set qdef = CurrentDb.CreateQueryDef("", strSQL)
' BIND PARAMETERS
qdef!MaxDateParam = DMax("Date1_Event", "TBL_Event", "ID=" & [Forms]![FRM_Main]![ID])
qdef!FormIDParam = [Forms]![FRM_Main]![ID]
' EXECUTE ACTION
qdef.Execute dbFailOnError
Set qdef = Nothing
虽然上面看起来不太寻常,但线条略多。不要被吓倒,跑向简单的1-2线。参数化是编程行业的最佳实践,不仅在VBA中,而且在所有使用用户输入值运行动态SQL查询的通用语言中都是如此。要执行操作查询(删除
,更新
,插入
)而SELECT
查询将作为记录集打开(CurrentDb.OpenRecordset
)
另外,考虑使用参数化来避免在查询中需要引用外壳或字符串连接。这里的最大日期是使用域聚合计算的,
DMax()
,而不是打开另一个查询
Dim strSQL As String
Dim qdef As Querydef
' PREPARE SQL STATEMENT
strSQL = "PARAMETERS [MaxDateParam] Date, [FormIDParam] Long;" _
& "UPDATE Tbl_Name SET CollectionDate = [MaxDateParam]" _
& " WHERE PID = [FormIDParam];"
' BUILD TEMP QUERY
Set qdef = CurrentDb.CreateQueryDef("", strSQL)
' BIND PARAMETERS
qdef!MaxDateParam = DMax("Date1_Event", "TBL_Event", "ID=" & [Forms]![FRM_Main]![ID])
qdef!FormIDParam = [Forms]![FRM_Main]![ID]
' EXECUTE ACTION
qdef.Execute dbFailOnError
Set qdef = Nothing
虽然上面看起来不太寻常,但线条略多。不要被吓倒,跑向简单的1-2线。参数化是编程行业的最佳实践,不仅适用于VBA,而且适用于所有使用用户输入值运行动态SQL查询的通用语言。非常感谢!我已经自学了很多Access/VBA,所以我通常甚至不知道从哪里开始(我几乎没有/没有编码经验…边学习边学习)。您知道在VBA中学习SQL/查询的任何资源吗?另外,对于[MaxDateParam],有没有办法调整它所提取的日期?我发现我需要稍微调整一下查询(我不一定要最大日期。我的表有一堆记录日期的条目,所以我要记录最近的日期。例如,我可能会在2017年6月1日记录2017年7月1日的日期。但如果我在2017年6月5日记录2017年6月15日的日期,我希望它更新到2017年6月5日记录的日期。)尝试使用按条件返回上次保存的值的域聚合。但听起来您也希望使用默认值
=Now()创建日期
或DateModified字段,其中表单上的保存函数更新此字段。这将是另一个SO问题。非常感谢。我最终将编写SQL查询的原始方法结合起来,并将该查询的值设置为MaxDateParam,以便在需要时可以修改查询。谢谢。这非常有助于考虑保存的查询Y.无需打开记录集,查询可以读取不带引号的表单控件。然后您需要查询时使用DLookup
。很高兴我能提供帮助。请接受答案(在旁边打勾)以确认解决方案。非常感谢!我一直在自学Access/VBA,所以我通常都不知道从哪里开始(我几乎没有/没有编码经验…边学习边学习)。你知道VBA中学习SQL/查询的资源吗?还有,对于[MaxDateParam],有没有办法调整它的日期?我想我需要稍微调整一下查询(我不一定要最大日期。我的表有一堆记录日期的条目,所以我要记录最近的日期。例如,我可能会在2017年6月1日记录2017年7月1日的日期。但如果我在2017年6月5日记录2017年6月15日的日期,我希望它更新到2017年6月5日记录的日期。)尝试使用按条件返回上次保存的值的域聚合。但听起来您也希望使用默认值=Now()创建日期
或DateModified字段,其中表单上的保存函数更新此字段。这将是另一个SO问题。非常感谢。我最终将编写SQL查询的原始方法结合起来,并将该查询的值设置为MaxDateParam,以便在需要时可以修改查询。谢谢。这非常有助于考虑保存的查询Y.无需打开记录集,查询可以读取不带引号的表单控件。然后,您需要查询DLookup
。很高兴我能提供帮助。请接受答案(在旁边打勾)以确认解决方案。