我确定这是一个基本问题,但是我正在努力掌握Access。
在我的情况下,我有两个表:Student和Subject,由连接表StudentSubject链接。学生与科目之间存在多对多的关系,因为一个学生可以学习多个科目,而一个科目可以被很多学生学习。
我不特别了解的是如何输入数据,以便每个学生可以学习多个科目。我创建了一个带有如下子窗体的表单:
当我尝试在“ SubjectName”字段中输入任何内容时,显示“字段无法更新”。如果我按“确定”,该消息消失,可以在该字段中键入内容,但是一旦我尝试在下面的“主题”记录中添加其他内容,就会出现相同的错误。然后,当我按箭头转到“表单”上的“下一个记录”并保存该表单时,任何表中都没有任何更改。
这是三个表及其关系:
我不太确定自己在做什么错,但是最终目标是我可以输入一个学生,也可以输入他们正在做的所有主题,以便存储每个学生各自的主题列表他们的名字旁边。我不知道“字段无法更新”错误来自何处。
有人可以建议吗?
答案 0 :(得分:2)
您需要3种形式:
Student-Subject表单将是其他两种形式的子表单。该表格可以有针对学生和学科的组合框。例如,这是编辑学生的样子:
通过这种方式,您可以轻松地添加学生正在学习的新科目(同样,可以添加正在学习某门学科的新学生)。
请注意,同时显示了“主题”和“学生”列。我过去做过的事情是有一些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中注册,则必须先添加新条目,然后才能选择此项。要动态添加新的文本条目,可以使用“不在列表中”事件来处理。