在MS Access(2003)中,我有一个包含左连接和内连接的SELECT查询,在数据表视图中显示为子表单。我希望用户能够在数据表视图中删除多个记录。当用户从记录的上下文菜单中选择“删除记录”时发生的默认删除不起作用;记录从数据表视图中消失,但继续存在于下垫表中,并在刷新视图时重新出现。
我尝试在Form_delete事件中定义删除查询,使用CodeContextObject对象获取所选记录的主键值,然后运行DELETE FROM tablename WHERE id = keyValue。此工作但Access显示警告“Microsoft Jet数据库引擎已禁用该进程,因为您和另一个用户正在尝试同时更改数据。”然后实际从表中删除记录,但它不会从视图中消失,而是显示为#Deleted。如何覆盖数据表视图中的默认删除过程?
这是SELECT查询:
SELECT *
FROM [SELECT *
FROM ((GeneralTable as G
INNER JOIN SpecificTable as S ON G.id = S.id)
LEFT JOIN Assigned as A on G.id = A.id)]. AS Q1
LEFT JOIN People AS P ON Q1.pID = P.pID
WHERE (((Q1.isPrimary) Is Null Or (Q1.isPrimary)=True));
我更改了表的名称,但设计是SpecificTable继承自GeneralTable,People以多对多关系分配给SpecificTable中的记录。此查询选择SpecificTable中的所有记录,并将该人员(如果有)分配为记录的主要记录。删除记录时,不应删除People表中的记录,但应删除G,S和A中的记录。
答案 0 :(得分:2)
我要给你的第一个答案是我认为最有经验的Access程序员可能会给你的答案:避免尝试在使用任何复杂的连接或子查询显示记录的表单中删除多个记录。换句话说,避免做你想做的事。
我的第二个建议是尝试类似于你已经尝试过的东西,一个SQL删除查询。我猜你可能正在使用DoCmd.RunSQL语句。我建议您使用以下代码:
CurrentDb.Excecute "DELETE * FROM tblMyTable WHERE ID = " & Me!ID, dbFailOnError
Me.Requery
但我不认为这完全解决了收到冲突错误消息的问题。
作为第三个建议,您可以在主窗体上放置一个运行上述代码的删除按钮。您必须从子表单中提取ID值。
我的第四个也是最后一个建议类似于我的第三个建议,而且我只能在理论上提出这个建议。您可以创建自己的右键单击菜单,并在其上放置一个运行上述代码的“删除”菜单项。我承认有一些关于这种方法的细节,我不知道如何在正确的时间和位置显示该菜单,并允许用户选择和删除多行。