【问题标题】:How can I input data for a many-to-many table in Access?如何在 Access 中为多对多表输入数据?
【发布时间】:2019-04-25 12:21:08
【问题描述】:

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

在我的例子中,我有两个表:Student 和 Subject,由联结表 StudentSubject 链接。学生和学科是多对多的关系,一个学生可以学习多个学科,而一个学科可以被多个学生学习。

具体我不明白的是如何输入数据,让每个学生可以学习不止一门学科。我创建了一个带有子表单的表单,如下所示:

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

这是三个表及其关系:

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

谁能给点建议?

【问题讨论】:

  • 这个问题太笼统了。具有多对多关系和联结表的数据输入通常非常困难,如果不使用 VBA,就无法真正开发出用户友好的 UI。就个人而言,我倾向于使用包含所有可能条目的数据表,以及一个复选框来指示条目之间是否存在可以使用 VBA 切换的关系。一个常见的替代方法是包含可能条目的列表框,其中条目可以选中或取消选中,但这也需要 VBA。

标签: ms-access ms-access-2016


【解决方案1】:

您需要 3 个表格:

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

Student-Subject 表单将是其他两种表单的子表单。此表格可以包含学生和科目的组合框。例如,以下是编辑学生的样子:

这样,您可以轻松地添加学生正在学习的新科目(同样,添加正在学习某个科目的新学生)。

请注意,“主题”和“学生”列都会显示。我过去所做的是有一点 VBA 来根据父窗体是什么来隐藏相应的列:

选项显式 ' 请注意,此代码以 Student-Subject 形式出现。 私有子 Form_Load() If Me.HasParent Then Me.cboStudentID.ColumnHidden = (Me.Parent.Name = "frmStudent") Me.cboSubjectID.ColumnHidden = (Me.Parent.Name = "frmSubject") 万一 结束子 ''''''''''''''''''''''''''''''''''''''' 公共函数 HasParent() 作为布尔值 On Error GoTo err_handle HasParent = Not Me.Parent 什么都不是 退出函数 错误句柄: HasParent = 假 退出函数 结束功能

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2020-01-13
      • 2015-03-29
      • 1970-01-01
      相关资源
      最近更新 更多