我在主窗体中有一个日期文本框,它在子窗体中输出 6 个连续日期(2 周间隔(。子窗体中填充这些日期作为主窗体AfterInsert()
事件的一部分。
Private Sub Form_AfterInsert()
Dim strSQL As String
Dim i As Integer
For i = 2 To 12 Step 2
strSQL = "INSERT INTO tbl_Date (DateDescriptionID, TestDate) "
strSQL = strSQL & "SELECT " & Me.tbDescriptionID & ", (DateAdd('ww', " & i & ", #" & Me.tbStartDate & "#));"
CurrentDb.Execute strSQL, dbFailOnError
Next i
End Sub
如果用户更改主窗体中的日期文本框,我希望子窗体日期反映该更改。我尝试了一个UPDATE
查询来用新日期替换现有日期,但在尝试对齐主要键时遇到问题。我只能用空值(null(替换现有日期,但不确定如何使用新日期相应地更新现有日期。
Private Sub tbStartDate_AfterUpdate()
Dim strSQL As String
strSQL = "UPDATE tbl_Date "
strSQL = strSQL & "SET [TestDate] = NULL "
strSQL = strSQL & "WHERE [DateDescriptionID] = " & Me.DescriptionID & ";"
CurrentDb.Execute strSQL, dbFailOnError
End Sub
用户输入 05/01/2018
Date Data
05/15/2018 Apple
05/29/2018 Banana
06/12/2018 Orange
06/26/2018 Strawberry
07/10/2018 Pineapple
07/24/2018 Peach
用户更改条目至 06/30/2018
Date Data
07/14/2018 Apple
07/28/2018 Banana
08/11/2018 Orange
08/25/2018 Strawberry
09/08/2018 Pineapple
09/22/2018 Peach
跳过所有SQL的东西,使用DAO和记录etclone- 更干净,更快,并自动更新:
Private Sub Form_AfterInsert()
Dim rs As DAO.Recordset
Dim i As Integer
Set rs = Me!NameOfYourSubformCONTROL.Form.RecordsetClone
For i = 2 To 12 Step 2
rs.AddNew
rs!DateDescriptionID.Value = Me!tbDescriptionID.Value
rs!TestDate.Value = DateAdd("ww", i, Me!tbStartDate.Value)
rs.Update
Next i
rs.Close
End Sub
和:
Private Sub tbStartDate_AfterUpdate()
Dim rs As DAO.Recordset
Dim i As Integer
Set rs = Me!NameOfYourSubformCONTROL.Form.RecordsetClone
rs.MoveFirst
While Not rs.EOF
i = i + 2
rs.Edit
rs!TestDate.Value = DateAdd("ww", i, Me!tbStartDate.Value)
rs.Update
rs.MoveNext
Wend
rs.Close
End Sub
请考虑使用相关的子查询,但由于 MS Access 仅允许对UPDATE
语句进行可更新的查询,因此请使用DCount
域聚合。此外,请考虑参数化以将 SQL 代码与 VBA 数据值完全分开。
具体来说,DCount
生成TestDate列的排名顺序,然后将每个列乘以 14,即所需的间隔天数长度(例如,1*14、2*14、3*14(。此解决方案不需要循环。
SQL (另存为存储的 Access 查询(
PARAMETERS [DescIDParam] Long;
UPDATE tbl_Date t
SET t.[TestDate] = DCount("*", "tbl_Date", "TestDate <= #" & t.[TestDate] & "#") * 14, t.[TestDate])
WHERE t.[DateDescriptionID] = [DescIDParam]
VBA
Private Sub tbStartDate_AfterUpdate()
Dim qdef As QueryDef
Set qdef = CurrentDb.QueryDefs("mySavedUpdateQuery")
' BIND VALUE TO PARAMETER
qdef![DescIDParam] = Me.tbDescriptionID
' EXECUTE ACTION
qdef.Execute dbFailOnError
Set qdef = Nothing
End Sub
我选择SQL:
我假设一个名为tblData
的表,其中包含字段ID
(PK、自动增量(、Data
(文本(和Sort
(长(
ID Data Sort
1 Apple 3
2 Banana 5
3 Orange 2
4 Strawberry 1
5 Pineapple 4
6 Peach 6
查询:
SELECT Data, DateAdd("ww", 2 * Sort, Forms!ParentForm!txtDate) as ComputedDate FROM tblData Order By Sort;
将其用作子窗体的记录源。如果txtDate
存储在表中,则可以联接或查找。 只有一个日期存储始终是最新的。