Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 如何在Access中输入多对多表的数据?_Ms Access_Ms Access 2016 - Fatal编程技术网

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

Ms access 如何在Access中输入多对多表的数据?,ms-access,ms-access-2016,Ms Access,Ms Access 2016,我确信这是一个基本的问题,但我正在努力解决访问问题 在我的例子中,我有两个表:Student和Subject,由一个连接表StudentSubject链接。学生和学科之间存在多对多关系,因为一个学生可以学习多个学科,一个学科可以被多个学生学习 我不清楚的是如何输入数据,这样每个学生都可以学习多个科目。我创建了一个表单,其子表单如下所示: 当我试图在“SubjectName”字段中输入任何内容时,它会显示“字段无法更新”。如果我按“OK”,消息就会消失,我可以在字段中键入一些内容,但一旦我尝试在

我确信这是一个基本的问题,但我正在努力解决访问问题

在我的例子中,我有两个表:Student和Subject,由一个连接表StudentSubject链接。学生和学科之间存在多对多关系,因为一个学生可以学习多个学科,一个学科可以被多个学生学习

我不清楚的是如何输入数据,这样每个学生都可以学习多个科目。我创建了一个表单,其子表单如下所示:

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

以下是三个表及其关系:

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


有人能提供建议吗?

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

您需要3张表格:

  • 一张学生表格
  • 一种科目表格
  • 学生主题表的一个表格
学生科目表将是其他两种形式的子表。此表单可以包含学生和主题的组合框。例如,编辑一个学生可能是这样的:

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

请注意,主题栏和学生栏都显示出来。我过去所做的是使用一点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 选项显式 '请注意,此代码位于学生科目表中。 专用子表单_加载() 如果我有父母的话 Me.cboStudentID.ColumnHidden=(Me.Parent.Name=“frmStudent”) Me.cbosubectId.ColumnHidden=(Me.Parent.Name=“frmSubject”) 如果结束 端接头 ''''''''''''''''''''''''''''''''''''''''''' 公共函数HasParent()为布尔值 On Error GoTo err_句柄 HasParent=不是我。父母什么都不是 退出功能 错误句柄: HasParent=False 退出功能 端函数
这样,根据您是编辑学生(学生栏将被隐藏)还是编辑主题(主题栏将被隐藏),相应的栏将被隐藏。

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