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

问题描述 投票:1回答:2

我确信这是一个基本问题,但我很难掌握Access。

在我的情况下,我有两个表:学生和主题,通过联结表,StudentSubject链接。学生和学科有很多关系,因为一个学生可以学习多个科目,一个科目可以由许多学生学习。

我不明白的是如何输入数据,以便每个学生可以学习多个科目。我创建了一个带有子窗体的窗体,如下所示:

enter image description here

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

enter image description here

以下是三个表及其关系:

enter image description here

我不太确定我在这里做错了什么,但最终的目标是我可以输入一个学生并输入他们正在做的所有科目,这样每个学生的个人科目列表都会与他们的名字一起存储。我不知道“字段无法更新”的错误来自哪里。

有人可以建议吗?

ms-access ms-access-2016
2个回答
2
投票

你需要3种形式:

  • 学生的一种形式,
  • 主题的一种形式
  • 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


这样,根据您是否正在编辑学生(并且将隐藏学生列)或编辑主题(并且隐藏主题列),隐藏相应的列。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.