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

时间:2018-08-30 15:52:01

标签: sql ms-access access-vba

我在主窗体中有一个日期文本框,该文本框在子窗体中输出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查询将现有日期替换为新日期,但是在尝试使主外键对齐时遇到了麻烦。我只能用空值(空)替换现有日期,但不确定如何用新日期相应地更新现有日期。

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

用户输入2018年5月1日

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

用户更改条目至2018年6月30日

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

3 个答案:

答案 0 :(得分:0)

请考虑使用相关子查询,但是由于MS Access仅允许对apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { applicationId "com.mydrinkmixer.somerestaurant.mydrinkmixer" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard- android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0-rc02' implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } 语句进行可更新查询,因此请使用UPDATE域聚合。另外,考虑使用parameterization将SQL代码与VBA数据值完全分开。

具体来说,DCount产生 TestDate 列的排名顺序,然后将它们分别乘以14,即所需的间隔天数(例如1 * 14、2 * 14、3 * 14)。此解决方案不需要循环。

SQL (另存为存储的Access查询)

DCount

VBA

PARAMETERS [DescIDParam] Long;
UPDATE tbl_Date t
SET t.[TestDate] = DCount("*", "tbl_Date", "TestDate <= #" & t.[TestDate] & "#") * 14, t.[TestDate])
WHERE t.[DateDescriptionID] = [DescIDParam]

答案 1 :(得分:0)

跳过所有SQL内容,并使用DAO和 recordsetclone -更干净,更快速且具有自动更新:

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

答案 2 :(得分:0)

我要使用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存储在表中,则可以加入或查找。 仅有一个日期始终保持最新。