Ms access 无法编辑查询';使用多个表引用和;分组方式;

Ms access 无法编辑查询';使用多个表引用和;分组方式;,ms-access,Ms Access,我有一个连续表单,显示一组时间范围和一个ID,当前看起来像: T1 T2 ID ---------------- 09:00 09:15 1 09:15 09:30 2 09:25 09:50 3 09:50 10:20 4 每个ID对该行都是唯一的。我的目标是突出显示任何冲突的时间(在本例中,ID为2和3的行在2结束之前3次开始冲突)。我决定使用条件格式来实现这一点,因此希望每行中都有一个字段来指示是否存在冲突 我通过使用两次引用数据集的查询实现了这一点,使我

我有一个连续表单,显示一组时间范围和一个ID,当前看起来像:

T1     T2     ID
----------------
09:00  09:15  1
09:15  09:30  2
09:25  09:50  3
09:50  10:20  4
每个ID对该行都是唯一的。我的目标是突出显示任何冲突的时间(在本例中,ID为2和3的行在2结束之前3次开始冲突)。我决定使用条件格式来实现这一点,因此希望每行中都有一个字段来指示是否存在冲突

我通过使用两次引用数据集的查询实现了这一点,使我能够相互比较行:

[a].[T1]<[b].[T2] And [a].[T2]>[b].[T1] And [a].[ID]<>[b].[ID]
为了删除所有重复项,我在a.ID字段上使用了groupby,并取计算字段的Max(0或-1),因此我得到了真值,如果每个a.ID都存在。这给了我:

a.T1   a.T2   a.ID  Clash
-------------------------
09:00  09:15  1     False
09:15  09:30  2     True
09:25  09:50  3     True
09:50  10:20  4     False
然而,由于这个新的计算字段,以及我实际上是在对结果进行分组,所以在连续表单视图中查看最终结果时,我不再能够编辑Time1或Time2

有没有办法我仍然可以编辑时间字段并保留这个新的计算字段?或者是一种单独的处理冲突的方法,允许我在表单视图中提供视觉反馈

我意识到这里有很多东西,我可能没有解释清楚,如果是这种情况,请让我知道


非常感谢您的帮助。

您的查询无法更新,因为有
分组依据。Access不知道要更改哪些记录。如果任何表或查询不可更新,并且在另一个查询的
联接中使用,则第二个查询也不可更新

资料来源:


我相信有更好的方法,但我知道
INSERT
将您的
GROUP BY
插入到一个新的临时表中是可行的。然后,您可以将分组数据表与实际数据连接起来。由于这两个记录集都是可更新的,您的查询也将是可更新的。

我是这样处理的:我从一个与原始查询非常相似的查询开始的,只是我使用了一个内部联接来减少返回的原始结果数

SELECT a.ID, a.T1, a.T2, b.ID, b.T1, b.T2,
    a.T2 > b.T1 AS Clash
FROM TimeSlots a INNER JOIN TimeSlots b ON b.ID > a.ID;
这个查询返回了

a.ID  a.T1      a.T2      b.ID  b.T1      b.T2      Clash
----  --------  --------  ----  --------  --------  -----
   1  09:00:00  09:15:00     2  09:15:00  09:30:00      0
   1  09:00:00  09:15:00     3  09:25:00  09:50:00      0
   2  09:15:00  09:30:00     3  09:25:00  09:50:00     -1
   1  09:00:00  09:15:00     4  09:50:00  10:20:00      0
   2  09:15:00  09:30:00     4  09:50:00  10:20:00      0
   3  09:25:00  09:50:00     4  09:50:00  10:20:00      0
我接受了你的提示,做了一个分组,只不过我做了MIN(),并将布尔值保留为数字

SELECT First(a.T1) AS T1, First(a.T2) AS T2, a.ID,
    MIN(a.T2 > b.T1) AS Clash
FROM TimeSlots a INNER JOIN TimeSlots b ON b.ID > a.ID
GROUP BY a.ID;
…它返回了

T1        T2        ID  Clash
--------  --------  --  -----
09:00:00  09:15:00   1      0
09:15:00  09:30:00   2     -1
09:25:00  09:50:00   3      0
然后我注意到ID=4丢失了,所以为了完整性,我将它添加回

SELECT First(a.T1) AS T1, First(a.T2) AS T2, a.ID,
    MIN(a.T2 > b.T1) AS Clash
FROM TimeSlots a INNER JOIN TimeSlots b ON b.ID > a.ID
GROUP BY a.ID
UNION ALL
SELECT T1, T2, ID, 0 AS Clash 
FROM TimeSlots WHERE ID IN (SELECT MAX(ID) FROM TimeSlots);
…所以我得到了

T1        T2        ID  Clash
--------  --------  --  -----
09:00:00  09:15:00   1      0
09:15:00  09:30:00   2     -1
09:25:00  09:50:00   3      0
09:50:00  10:20:00   4      0
现在是棘手的一点。该查询是不可更新的,并且(根据我有限的测试)也不是任何连接到它的查询,也不是直接在子查询中使用它的查询

但是,如果我将该查询另存为[ClashList],并将其与VBA函数一起使用

Public Function GetClashStatus(ID As Long) As Long
GetClashStatus = DLookup("Clash", "ClashList", "ID=" & ID)
End Function
…我可以创建此查询

SELECT TimeSlots.T1, TimeSlots.T2, TimeSlots.ID, GetClashStatus(TimeSlots.ID) AS Clash
FROM TimeSlots;
…而且它是可更新的

编辑 事实证明,VBA函数不是必需的。这也行得通:

SELECT TimeSlots.T1, TimeSlots.T2, TimeSlots.ID, 
    DLookup("Clash", "ClashList", "ID=" & ID) AS Clash
FROM TimeSlots;

很好的跟进,我实际上在那里输入了一个错误,我现在已经纠正了。第二部分应该是
[a].[T2]>=[b].[T1]
ID 1(09:00-09:15)是否符合ID 2(09:15-09:30)的冲突条件?这一对满足您问题中的修订条件,但您的预期输出显示ID 1的Clash=False。这就是我没有直接从自己的数据中复制,只是在编写问题时补足的结果。你说得对,为了使我的示例有效,我应该使用
=
我实际上使用了这个想法作为最终解决方案。我使用了第二个没有计算碰撞列的查询。相反,它使用dlookup从不可编辑的查询中获取冲突值。是的,因为第二个查询不需要计算冲突列,所以它不需要两次引用原始表。因此,我不需要对任何记录进行分组,并且可以从之前分组的查询中读取冲突(使用dlookup)。。。因为
DLookup()
是只读的。我的答案至少有用吗?我想碰撞字段永远不会真正可编辑,但因为它是一个纯计算字段,所以我不希望期望它永远可编辑。你的回答很有用是的,谢谢!这让我意识到我无法使原始查询可编辑,因此我寻找方法将不可编辑的数据放入可编辑的记录集中。感谢Gord的回答,我用类似的解决方案回复了coge.soft,但解释得不如此。到目前为止,它似乎工作得很好(除了没有显示条件格式的图形故障,但这是另一个问题)。
SELECT TimeSlots.T1, TimeSlots.T2, TimeSlots.ID, 
    DLookup("Clash", "ClashList", "ID=" & ID) AS Clash
FROM TimeSlots;