2017-06-28 15 views
0

VBAで更新クエリを実行しようとしていますが、コードのために書くべきものが失われています。私は、テーブルから最新の日付を見つけるためにクエリを実行しています。そのクエリは正常に動作します。ここでは、更新クエリを実行して、別のテーブルの日付フィールドを照会された日付に更新します。ここで私が持っているものです。クエリ値に基づいてVBAで更新Qryを実行する

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) 

は、このような更新クエリを実行する方法はありますか?ありがとうございました。

答えて

2

アクションクエリ(DELETEUPDATEINSERT INTOSELECTクエリはレコード(CurrentDb.OpenRecordset)として開かれるべきであるが(CurrentDb.Execute)実行されます。

さらに、クエリでエンクロージャまたは文字列を引用符で囲む必要がないように、パラメータ化を使用することを検討してください。ここでは、別のクエリを開く代わりに、ドメイン集計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クエリを実行するすべての汎用言語にわたって、プログラミング業界のベストプラクティスです。

+0

ありがとうございました!私は自分自身で多くのAccess/VBAを自分自身で教えてきましたので、どこから始めたらいいのかわかりません(コーディングの経験はほとんどありません。あなたはVBA内でSQL /クエリを学習するためのあらゆるリソースを知っていますか? – xpandamonium

+0

また、[MaxDateParam]には、引っ張っている日付を微調整する方法がありますか?私は少し質問を微調整する必要があることを理解しました(私は必ずしも最大の日付を必要としません。私のテーブルには日付を記録するエントリがたくさんあるので、記録された最新の日付が必要です。 2011年6月1日に記録された2011年7月1日の日付が2011年6月1日に記録されますが、2011年6月5日に記録された6/15/2017の日付を記録すると、 – xpandamonium

+0

[DLast()](https://www.techonthenet.com/access/functions/domain/dlast.php)ドメイン集約を使用して、最後に保存された値を条件で戻してみてください。しかし、フォームのsave関数がこのフィールドを更新するデフォルトの '= Now()'や* DateModified *フィールドを持つ* DateCreated *を持っているように思えます。これはもう一つの問題です。 – Parfait

関連する問題