Ms access 无法编辑查询';使用多个表引用和;分组方式;
我有一个连续表单,显示一组时间范围和一个ID,当前看起来像: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次开始冲突)。我决定使用条件格式来实现这一点,因此希望每行中都有一个字段来指示是否存在冲突 我通过使用两次引用数据集的查询实现了这一点,使我
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;