Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于查询值在VBA中运行Update Qry_Vba_Ms Access - Fatal编程技术网

基于查询值在VBA中运行Update Qry

基于查询值在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 = '" &

我试图在VBA中运行一个更新查询,但我不知道应该为代码编写什么。我正在运行一个查询以从表中查找最近的日期。这个查询很有效。现在我想运行一个更新查询,将另一个表的日期字段更新为与查询的日期相同。以下是我所拥有的:

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
。很高兴我能提供帮助。请接受答案(在旁边打勾)以确认解决方案。