多对多关系中的数据输入表单/子表单

时间:2017-01-22 21:37:47

标签: ms-access many-to-many ms-access-2007

我有一个具有多对多关系的Access数据库。 origin表称为 Property ,目标表称为 Person 。房产可以拥有多个房产,一个人可以拥有多个房产。我创建了一个连接表以适应这种M-M关系。

以下是关系布局:enter image description here

为了填充这些表,我为 Property 创建了一个表单,其中包含 Person 表的子表单。我按照几篇文章和帖子来实现所需的功能。它们是herehereherehere

以下是表格:enter image description here

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 表中创建新条目的功能,同时要求用户确认新条目?

P.S。我知道问题标题没有具体反映内容,但我找不到更好的措辞。

编辑:为了简化问题,我缩减了表格中的字段。还有其他属性,如出生日期,可以区分两个同名的人。

2 个答案:

答案 0 :(得分:0)

推荐的方法是弹出表单以将新人添加到人员表。您无法添加此人的直接问题可能是因为您将[PersonName]字段设置为人员表中的主键,或者您将该字段设置为不允许的索引重复。

我建议您考虑查找有关数据规范化的信息。这有助于理解主键和外键。

答案 1 :(得分:0)

我最近有一个类似的问题。我将第二个建议与弹出式表单一起使用。我的问题似乎与您遇到的问题相似。当多方已经有条目时,Access不喜欢在关系的一侧添加内容。

第二句acr_scout所说:您只需在表单上添加一个按钮即可打开另一个表单。

  1. 创建一个表单,使您可以在人员表中输入新人员。
  2. 在原始表单的设计视图中,添加一个按钮。在Access 2016中,这应该只是一个被称为“按钮”的按钮(还有其他按钮),然后Access将启动向导,并且有一个选项可以选择单击过程,以打开您选择的形式。

    我只是尝试了一下,它完美无缺,不需要VBA编码。如果愿意,您还可以创建一个切换按钮并自己添加自定义OnClick过程。

另一种不太优雅的方法可能是以原始形式包含人员表的子表单。

编辑:对于您正在做的事情,如果我正确理解了您的问题,则无需任何vba代码。 Gerard Verschuuren博士拥有a great tutorial on YouTube,在创建多对多表单时对我有很大帮助。