Microsoft Access - 在主表单加载/更新时创建子表单记录

问题描述 投票:0回答:1

我对 Microsoft Access 比较陌生,但很快就掌握了它。我试图弄清楚一旦加载主表/表单,我可以使用哪种 VBA 或 SQL 代码来强制在子表单中创建新记录。让我解释一下我目前的形式情况:

主表单名称:frmUpload,主键“ID”
子表单 1:frmIdentifiers,FK“ApplicantID”
子表单 2:frmFIdentifiers,FK“ApplicantID”
子表单 3:frmOther,FK“ApplicantID”

这三个子窗体存在于主窗体上,分别将数据记录到 tblIdentifiers、tblFIdentifiers 和 tblOther。这三个子表单只有复选框。在大多数使用情况下,用户将在 frmUpload 上填写适用的信息,并将在 frmIdentifiers、frmFIdentifiers 或 frmOther 中填写信息。多个子表单中的复选框不太可能被使用。

表单链接已正确建立。如果我在主窗体上输入信息并在子窗体之一中使用复选框,则主/外键会自动填充。这不是问题。

我的问题是:有没有办法强制记录写入其他未使用的表?例如,如果用户只将数据记录到frmUpload/tblUpload和frmOther/tblOther,我该怎么做才能使frmIdentifiers/tblIdentifiers和frmFIdentifiers/tblFIdentifiers都填充“申请人ID”等于主表单的主键?

谢谢你。

我为此尝试过的现有解决方法:

  • 默认值为“是”的复选框,如果未使用子表单之一,用户将禁用该复选框。通过这种方式,这会强制子表单输入并创建具有正确父/子链接的新记录。对于用户交互来说更不方便且不太理想。
  • VBA代码。创建了 3 个布尔变量,默认设置为 False,为每个子子表单的 If 语句。在表单输入时,该子表单的变量设置为 true,如果其他子表单的布尔值设置为 false,则在 VBA 中运行的 SQL 语句将尝试执行记录并将其添加到子表单各自的表中。 SQL 语句无法正常工作,没有记录插入到相应的表中。

这是代码:

Dim fCheck As Boolean
Dim iCheck As Boolean
Dim oCheck As Boolean

Private Sub frmIdentifiers_Enter()

    If fCheck = True And oCheck = True Then
 
        iCheck = True

    ElseIf oCheck = True Or fCheck = True Then

        iCheck = True

    Else
    
        DoCmd.GoToControl "frmFIdentifiers"
        DoCmd.GoToRecord , , acNewRec
        DoCmd.GoToControl "frmOther"
        DoCmd.GoToRecord , , acNewRec
        cpiCheck = True

    End If

End Sub

对于其他两种形式运行相同的代码,并根据需要切换 If 语句和布尔值。

vba forms ms-access
1个回答
0
投票

简单来说,就是在表单中添加一个按钮,并将表单的数据保存到表格中。
例如,从更规范化的表结构开始,例如本例中与 1 类型表的多对多关系。

Relationships

设置关系后,请尝试使用功能区上的向导为多对多关系中的每个表创建一个表单。 尝试每个生成的表单,并注意使用 Access 的表单子表单方法构建的生成表单的外观和工作方式。
我希望您会发现这些复杂关系的默认形式除了表格的迟钝之外还增加了另一层混乱。 表单应该从人类转换为数据库,并完成尽可能多的工作。 对于多对多关系,我喜欢从顶部更用户友好的表单开始,结合底部的查询,显示数据库中的相关更改。

为了快速起见,我从查询开始获取相关的数据库更改,然后使用向导从查询创建选项卡式表单。 然后,我在表单标题中添加了一堆未绑定的控件,以实现表单顶部的人类友好,并用组合框替换了大多数文本框。

SELECT Applicants.ApplicantID, Applicants.ApplicantName, Identifiers.IdentifierID, Identifiers.IdentifierDescription, IdentifierTypes.IdentifierTypeID, IdentifierTypes.Description, ApplicantsIdentifiers.isChecked
FROM IdentifierTypes INNER JOIN (Identifiers INNER JOIN (Applicants INNER JOIN ApplicantsIdentifiers ON Applicants.ApplicantID = ApplicantsIdentifiers.ApplicantID) ON Identifiers.IdentifierID = ApplicantsIdentifiers.IdentifierID) ON IdentifierTypes.IdentifierTypeID = Identifiers.IdentifierTypeID;

enter image description here

enter image description here

enter image description here

'if you still wanted to select multiple identifiers at once 'only chkA shown unselects all as well
Private Sub chkA_Click()
'Me.chkB = Me.chkA
'Me.chkC = Me.chkA

End Sub

Private Sub cmdAddRecord___Click()
Dim db As Database
Dim rs As Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("ApplicantsIdentifiers")

'obviously better to use a multi-select listbox and cycle through the selected items
If Me.chkA = True Then
rs.AddNew
rs!ApplicantID = Me.cmbApplicantUnbound
rs!IdentifierID = 1
rs!isChecked = True
rs.Update
End If

If Me.chkB = True Then
rs.AddNew
rs!ApplicantID = Me.cmbApplicantUnbound
rs!IdentifierID = 2
rs!isChecked = True
rs.Update
End If

If Me.chkC = True Then
rs.AddNew
rs!ApplicantID = Me.cmbApplicantUnbound
rs!IdentifierID = 3
rs!isChecked = True
rs.Update
End If

'clean up
rs.Close
Set rs = Nothing
Set db = Nothing
'reset checkboxes
Me.chkA = False
Me.chkB = False
Me.chkC = False
Me.Requery 'show changes to data
End Sub
----------------------------------------------------------------------------------
|    IdentifierID    |     IdentifierDescription      |     IdentifierTypeID     |
----------------------------------------------------------------------------------
|                  1 | A                              |                        1 |
----------------------------------------------------------------------------------
|                  2 | B                              |                        2 |
----------------------------------------------------------------------------------
|                  3 | C                              |                        3 |
----------------------------------------------------------------------------------

-------------------------------------------
|  IdentifierTypeID  |    Description     |
-------------------------------------------
|                  1 | Identifier         |
-------------------------------------------
|                  2 | Fidentifier        |
-------------------------------------------
|                  3 | Oidentifier        |
-------------------------------------------


© www.soinside.com 2019 - 2024. All rights reserved.