我有一个具有多对多关系的 Access 数据库。源表称为 Property,目标表称为 Person。一处房产可以有多个所有者,一个人可以拥有多个房产。我创建了一个连接表来适应这种 M-M 关系。
为了填充这些表格,我为 Property 创建了一个表单,并为 Person 表创建了一个子表单。我遵循了几篇文章和帖子来实现所需的功能。他们是这里、这里、这里和这里。
PersonName 是一个组合框,其行源设置为以下 SQL 查询:
SELECT Person.idPerson, Person.PersonName FROM Person;
列数设置为2,宽度设置为0cm;1cm
我用于组合框的NoInList事件的VBA代码是:
Private Sub PersonName_NotInList(NewData As String, Response As Integer)
strSQL = "INSERT INTO Person([PersonName]) " & _
"VALUES ('" & NewData & "');"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
MsgBox "The new person has been added to the list." _
, vbInformation, "Data Entry"
Response = acDataErrAdded
End Sub
到目前为止一切正常,但我面临着两个人同名的情况。该表单不允许这样做,因为每次您键入表中已有的名称时,可以预见您会获得与此人关联的现有值。在 Person 表中创建新条目会使该条目在表单的组合框中可见,但我不希望数据条目用户编辑表。
如何实现从表单在 Person 表中创建新条目的功能,同时要求用户确认新条目?
附注我知道问题标题并没有具体反映内容,但我找不到更好的措辞。
编辑:为了使问题简单,我修剪了表格中的字段。还有一些其他属性,例如出生日期,可以区分两个同名的人。
推荐的方法是弹出一个表单以将新人员添加到人员表中。您无法添加人员的直接问题可能是因为您将 [PersonName] 字段设置为人员表中的主键,或者将该字段设置为不允许重复的索引。
我建议您考虑查找有关数据标准化的信息。这将有助于理解主键和外键。
我最近也遇到了类似的问题。我通过弹出表单附议该建议。我的问题似乎与你的问题相似。当多方已经有条目时,Access 不喜欢在关系的一侧添加内容。
赞同 acr_scout 所说的:您只需在表单上添加一个按钮即可打开另一个表单。
创建一个表单,允许您在人员表中输入新人员。
在原始表单的设计视图中,添加一个按钮。在 Access 2016 中,这应该只是一个名为“按钮”的按钮(还有其他按钮),然后 Access 将启动一个向导,并且有一个选项可以选择单击过程来打开您选择的表单。
我刚刚尝试了一下,它工作完美,不需要 VBA 编码。如果您愿意,您还可以创建一个切换按钮并自行添加自定义 OnClick 过程。
另一种不太优雅的方法可能是在原始表单中包含人员表的子表单。
编辑: 对于您正在做的事情,如果我正确理解您的问题,则不需要 vba 代码。 Gerard Verschuuren 博士在 YouTube 上有一个很棒的教程,它在创建多对多表单时给了我很大帮助。