Access 2010表单关联SQL Server后查询记录集无法更新问题
解决Access表单查询加Inner Join后记录集不可更新的问题
我之前碰到过好多次Access里这种情况——当你用了带聚合函数(比如MAX)的INNER JOIN后,查询结果集就变成不可更新的了,根本没法编辑表单里的复选框。这是因为你关联的是一个由GROUP BY生成的虚拟汇总表,Access没法确定怎么把表单的修改同步回原物理表TblA。
不过别担心,我们可以调整查询结构,既能保留“获取每个Reference对应的最新名称(最大PKID记录)”的需求,又能让记录集恢复可更新状态,下面给你两个可行的方案:
方案1:用关联子查询替代INNER JOIN
把原来的JOIN换成WHERE子句里的关联子查询,这样查询的主体还是直接来自TblA的物理记录,Access就能识别出可更新字段了:
SELECT TblA.Reference, TblA.Yes, TblA.Nm, TblA.PKID FROM TblA WHERE -- 筛选出每个Reference对应的最大PKID记录 TblA.PKID = (SELECT MAX(PKID) FROM TblA AS T WHERE T.Reference = TblA.Reference) -- 保留原有的筛选条件 AND TblA.Reference Like "*" & [forms]![NewPayments]![Combo1] & "*" AND TblA.Nm Like "*" & [forms]![NewPayments]![ClientName] & "*" AND TblA.Account Like "*" & [forms]![NewPayments]![ACN] & "*" AND TblA.Query Is Null;
方案2:用DMax域函数简化查询
Access的域聚合函数DMax可以直接返回指定条件下的最大值,写法更简洁,同样能保持记录集可更新:
SELECT TblA.Reference, TblA.Yes, TblA.Nm, TblA.PKID FROM TblA WHERE -- 用DMax获取当前Reference对应的最大PKID TblA.PKID = DMax("PKID", "TblA", "Reference = '" & TblA.Reference & "'") -- 原筛选条件不变 AND TblA.Reference Like "*" & [forms]![NewPayments]![Combo1] & "*" AND TblA.Nm Like "*" & [forms]![NewPayments]![ClientName] & "*" AND TblA.Account Like "*" & [forms]![NewPayments]![ACN] & "*" AND TblA.Query Is Null;
小提示
如果你的Reference字段是文本类型且可能包含单引号,那DMax里的条件要调整成用双引号转义:"Reference = """ & TblA.Reference & """"
要是Reference是数字类型,直接用原来的写法就行。
你可以测试一下这两个查询,应该都能让表单里的Yes复选框恢复可勾选状态,同时保证每个Reference只显示最新的那条记录。
内容的提问来源于stack exchange,提问作者New2Programming
相关产品推荐
相关产品推荐

