我对 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”等于主表单的主键?
谢谢你。
我为此尝试过的现有解决方法:
这是代码:
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 语句和布尔值。
简单来说,就是在表单中添加一个按钮,并将表单的数据保存到表格中。
例如,从更规范化的表结构开始,例如本例中与 1 类型表的多对多关系。
设置关系后,请尝试使用功能区上的向导为多对多关系中的每个表创建一个表单。 尝试每个生成的表单,并注意使用 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;
'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 |
-------------------------------------------