如何从主窗体以线性方式更新多个子窗体记录?



我在主窗体中有一个日期文本框,它在子窗体中输出 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存储在表中,则可以联接或查找。 只有一个日期存储始终是最新的。

最新更新