如何在Access中为多对多表输入数据?

时间:2019-04-25 12:21:08

标签: ms-access ms-access-2016

我确定这是一个基本问题,但是我正在努力掌握Access。

在我的情况下,我有两个表:Student和Subject,由连接表StudentSubject链接。学生与科目之间存在多对多的关系,因为一个学生可以学习多个科目,而一个科目可以被很多学生学习。

我不特别了解的是如何输入数据,以便每个学生可以学习多个科目。我创建了一个带有如下子窗体的表单:

enter image description here

当我尝试在“ SubjectName”字段中输入任何内容时,显示“字段无法更新”。如果我按“确定”,该消息消失,可以在该字段中键入内容,但是一旦我尝试在下面的“主题”记录中添加其他内容,就会出现相同的错误。然后,当我按箭头转到“表单”上的“下一个记录”并保存该表单时,任何表中都没有任何更改。

enter image description here

这是三个表及其关系:

enter image description here

我不太确定自己在做什么错,但是最终目标是我可以输入一个学生,也可以输入他们正在做的所有主题,以便存储每个学生各自的主题列表他们的名字旁边。我不知道“字段无法更新”错误来自何处。

有人可以建议吗?

2 个答案:

答案 0 :(得分:2)

您需要3种形式:

  • 一种学生形式,
  • 一种形式的主题
  • Student-Subject表的一种形式

Student-Subject表单将是其他两种形式的子表单。该表格可以有针对学生和学科的组合框。例如,这是编辑学生的样子:

Student form with subject sub-form

通过这种方式,您可以轻松地添加学生正在学习的新科目(同样,可以添加正在学习某门学科的新学生)。

请注意,同时显示了“主题”和“学生”列。我过去做过的事情是有一些VBA可以根据父表单的内容隐藏相应的列:

Option Explicit

' note that this code goes in the Student-Subject form.
Private Sub Form_Load()

If Me.HasParent Then
    Me.cboStudentID.ColumnHidden = (Me.Parent.Name = "frmStudent")
    Me.cboSubjectID.ColumnHidden = (Me.Parent.Name = "frmSubject")
End If

End Sub
'''''''''''''''''''''''''''''''''''''''''''
Public Function HasParent() As Boolean
    On Error GoTo err_handle

    HasParent = Not Me.Parent Is Nothing
    Exit Function

err_handle:
    HasParent = False
    Exit Function

End Function


通过这种方式,根据您是编辑学生(隐藏学生列)还是编辑主题(隐藏主题列)来隐藏适当的列。

答案 1 :(得分:0)

通常,您对这种多对多关系有两种不同的看法。一个是您在学生的视野中,另一个是您在学科的视野中。 对于学生视图,必须创建一个表单来编辑学生表,并且必须添加一个子表单来编辑详细数据表,即StudentSubject。该详细信息表必须与主表单中的StudentID同步。通常,此操作已由向导完成。但是请注意,明细表中只有ID。要显示可读信息,您需要将文本框更改为组合框,并将组合框绑定到基础表。 由于详细信息表StudentSubject中只有数字,因此无法直接在此框中输入文本。如果SubjectName尚未在表Subject中注册,则必须先添加新条目,然后才能选择此项。要动态添加新的文本条目,可以使用“不在列表中”事件来处理。