【问题标题】:Query is read-only probably due to an aggregated value查询是只读的,可能是由于聚合值
【发布时间】:2019-12-16 17:21:42
【问题描述】:

有一个现有的 MS-Access 项目(不是我做的),人们希望在数据表中添加一个附加列以用于高级过滤器。

想象一下一个简单的直接查询填充到数据表视图中的表单。人们可以使用内置过滤器和排序选项。

对于基础表(我们称之为MainTable),还有另一个与审计数据相关的表(称之为AuditTable)。 MainTable 中的任何更改都会写入此 AuditTable,并且必须由另一个进程中的超级用户接受。

现在我想将尚未接受的审核行数添加到可见数据表中。类似的东西

SELECT Count(*) AS OpenAudit 
FROM AuditTable 
WHERE MainTableID=MainTable.ID --<-- MainTableID is the FK in AuditTable onto the ID of MainTable
  AND Accepted=0
GROUP BY MainTableID

将它添加到基础查询并在新列中显示值非常有用。过滤,排序,一切都很好。我尝试了它以及 子选择列 以及加入 from 子句中的 side 查询

但是现在出现了这个问题:

数据表突然只读。用户无法再更改那里的任何数据。

我发现,包含聚合数据和/或子选择的查询或由堆叠查询组成的查询将导致读取-仅记录集(list by Allen Brown)

问题来了:

是否有任何方法可以在不将 RecordSource 更改为 只读 集的情况下将此类数据包含在记录集中?

一些简单的示例数据

MainTable
ID    SomeValue   OneMore
 1       val 1      more 1
 2       val 2      more 2
 3       val 3      more 3

AuditTable
ID    MainTableID   Accepted  --(+ more columns with fieldname, valueBefore and valueAfter etc)
 1         1            1
 2         1            0
 3         2            1
 4         3            0
 5         3            0

 The expected Result
 ID    SomeValue   OneMore    CountOfOpenAudits
 1       val 1      more 1            1
 2       val 2      more 2            0
 3       val 3      more 3            2

这个附加列应该以某种方式在用户的 GUI 中可见,而无需将记录集更改为只读

希望这很清楚,TIA!

【问题讨论】:

  • 如果 DCount() 破坏了性能,唯一的另一个选择是将上述查询的结果插入到临时表中,并将其连接到记录源的主表中。但是您需要在需要时保持数据最新的方法。
  • 或者,如果基础数据来了,例如从 SQL Server,创建和链接一个视图,并以此为基础。
  • 如果是表格,则不要在记录源中包含聚合。相反,添加一个文本框并将该文本框设置为域聚合。这允许延迟加载并提高性能。
  • @ErikA,感谢您的意见。在使用DCount 进行测试后,我可以说它可以工作并且性能足够好。如果事情变得更大(因此变慢),我会回复您的建议。
  • @Andre,正如下面 Lee Mac DCount 的回答所写的那样,它做得很好。再次感谢您!

标签: ms-access aggregate readonly datasheet


【解决方案1】:

您可以使用诸如DCount 之类的域聚合函数,但它会更慢。

例如:

select t.*, dcount("*","AuditTable","MainTableID=" & t.ID & " and Accepted=0") as OpenAudits
from MainTable t

【讨论】:

  • 几年前我用 MS-Access 做了很多,但我忘记了 D 功能。 Thx,DCount 成功了,在这个相当小的情况下,性能已经足够了......