MS-Access 连接表在两个互斥列表之间插入/删除(2 个列表框)

Posted

技术标签:

【中文标题】MS-Access 连接表在两个互斥列表之间插入/删除(2 个列表框)【英文标题】:MS-Access Junction Table Inserts/Deletions Between Two Mutually Exclusive Lists (2 Listboxes) 【发布时间】:2010-07-29 21:21:51 【问题描述】:

有了这个kind of design,我想创建一个功能来添加和删除junction table中的记录。

案例来自编辑员工并选择他们可以参加的考试。左侧列表框中将是他们没有资格参加的考试(无论如何)以及他们在右侧列表框中有资格参加的考试。

表格是这样的:

TABLE EmpExam 
(
  EmpID,
  ExamID
)

EmpID 始终是已知的,但ExamID 将从左侧列表框中选择。右侧列表框中的记录可能必须同时具有 EmpIDExamID 才能被删除。

一旦它们进入各自的框,就不需要立即删除/插入(它们可以等到表单关闭)。

在 Access 中是否有一个好的/标准的方法来完成这个?

【问题讨论】:

【参考方案1】:

当您必须使用代码将项目添加到表中然后使用代码删除它们时,为什么要使用列表框?

对于您想要做的事情,子表单是通常的解决方案。此外,您可以使用子表单的记录克隆。请注意,您可能应该在该设置中有一个日期时间字段。此外,如果 ExamID 是唯一的,并且启用了级联删除,则从主表中删除会从子表中删除。

【讨论】:

你的意思是,如果我从考试表中删除,那么 EmpExam 条目也会被删除?如果是这样,那么这就是我的意图和设置。另外,关于您的建议是否有一个很好的教程? 是的,但它确实带有警告:granite.ab.ca/access/cascadeupdatedelete.htm,但是,在这种情况下它可能是合适的。这是一个教程:office.microsoft.com/en-us/access-help/… 请注意,如果您运行删除查询,您可能不会收到即将从多个表中删除的警告。 您知道您不知道,您可以创建绑定到 EmpID 上的联结表的子表单,只需一个组合框,其中考试列表作为其行源,ExamID 作为其绑定列。这将为您提供很大的控制权,包括通过检查 recordset.recordcount 是否小于或等于考试计数来防止添加超出考试问题计数的行的能力? 是的,如果您使用 CurrentDb.Execute 方法,您肯定不会收到警告。【参考方案2】:

我最终使用了两个列表框,其中包含 1 个添加按钮和 1 个删除按钮,它们触发了执行原始 SQL 的 VBA On Click 方法。

该方法如下所示:

If IsNull(cboInEligible.Column(1))
  Exit Sub
End If

CurrentDB.Execute ("INSERT INTO tblEmpExam (ExamID, EmpID) " & _
                   "VALUES (" & ExamID & ", " & lstInEligible.Column(1) & ")")

lstInEligible.Requery
lstEligible.Requery

删除查询也是类似的。

这两个列表框是互斥的。

SELECT EmpID, EmpName
FROM Employee
WHERE EmpID NOT IN (SELECT EmpID FROM tblEmpExam WHERE ExamID = [txtExamID]);

txtExamID 是表单上的一个隐藏(但对设计者来说很明显)控件,因为除了通过控件或绝对命名之外,我无法引用表单的 ExamID。

另一个列表框有EmpID IN 而不是EmpID NOT IN 以使其独占。

【讨论】:

以上是关于MS-Access 连接表在两个互斥列表之间插入/删除(2 个列表框)的主要内容,如果未能解决你的问题,请参考以下文章

ms-access:控制源和行源的区别

在 ms-access 中获取表的外键约束列表?

将文本框中的值插入 2 个不同的表 ms-access

两个线程之间的列表共享

经典 ASP 和 ms-access:插入数据的问题

MySQL 性能:两个表在公共外键上的连接:仍然“使用 where”