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
将从左侧列表框中选择。右侧列表框中的记录可能必须同时具有 EmpID
和 ExamID
才能被删除。
一旦它们进入各自的框,就不需要立即删除/插入(它们可以等到表单关闭)。
在 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 个列表框)的主要内容,如果未能解决你的问题,请参考以下文章