我有一个具有多对多关系的Access数据库。 origin表称为 Property ,目标表称为 Person 。房产可以拥有多个房产,一个人可以拥有多个房产。我创建了一个连接表以适应这种M-M关系。
为了填充这些表,我为 Property 创建了一个表单,其中包含 Person 表的子表单。我按照几篇文章和帖子来实现所需的功能。它们是here,here,here和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。我知道问题标题没有具体反映内容,但我找不到更好的措辞。
编辑:为了简化问题,我缩减了表格中的字段。还有其他属性,如出生日期,可以区分两个同名的人。
答案 0 :(得分:0)
推荐的方法是弹出表单以将新人添加到人员表。您无法添加此人的直接问题可能是因为您将[PersonName]字段设置为人员表中的主键,或者您将该字段设置为不允许的索引重复。
我建议您考虑查找有关数据规范化的信息。这有助于理解主键和外键。
答案 1 :(得分:0)
我最近有一个类似的问题。我将第二个建议与弹出式表单一起使用。我的问题似乎与您遇到的问题相似。当多方已经有条目时,Access不喜欢在关系的一侧添加内容。
第二句acr_scout所说:您只需在表单上添加一个按钮即可打开另一个表单。
在原始表单的设计视图中,添加一个按钮。在Access 2016中,这应该只是一个被称为“按钮”的按钮(还有其他按钮),然后Access将启动向导,并且有一个选项可以选择单击过程,以打开您选择的形式。>
我只是尝试了一下,它完美无缺,不需要VBA编码。如果愿意,您还可以创建一个切换按钮并自己添加自定义OnClick过程。
另一种不太优雅的方法可能是以原始形式包含人员表的子表单。
编辑:对于您正在做的事情,如果我正确理解了您的问题,则无需任何vba代码。 Gerard Verschuuren博士拥有a great tutorial on YouTube,在创建多对多表单时对我有很大帮助。