2011-12-06 78 views
0

我在如何完成访问中的以下方案完全损失:MS访问:排名/优先级排序

说我有两个表,用户和任务。

Users      Tasks 
----------------------  ---------------------- 
Username [Primary Key] <1--∞> Username [Foreign Key] 
           Task ID [Primary Key] 
           Priority 

我想显示一个窗体,显示特定用户的任务,按优先级(整数)排序​​。优先级不固定,我需要确保同一用户的两个任务没有相同的优先级。我不知道如何使用Access来完成此操作。我需要为表单构建什么样的查询?理想情况下,我希望在表单上有两个按钮来提高/降低任务的优先级。

任何建议将不胜感激。我不反对使用VBA,如果这是需要的,但我有一种感觉,这是一个优雅的解决方案。

(注:我工作的实际DB是非常不同的,但知道如何做到这一点会让我弄清楚如何获得我所需要的。)

回答

1

上的用户名和优先级唯一索引在任务表上执行你的规则。当用户尝试保存违反该密钥的数据时将发出警告。您可能想要捕捉错误并提供更好的解释。

主窗体可以基于用户和基于任务的子窗体。访问将有助于帮助您使用用户名(您的关键字段)为父窗体和子窗体。

当前记录上的一个小VBA可以增加优先级字段。您将有两个按钮,每个按钮都带有On_Click事件以增加/减少值。例如:[Priority] = [Priority] + 1

+0

这有帮助。假设我在增加/减少价值时想交换优先级。这将如何工作? – jdiaz5513

+0

@ user1082589您可以使用记录集在before update事件中选择匹配的优先级,并与用户检查所需的操作。更新前允许取消该记录优先级的事件,或者可以将匹配的优先级更新为预先测试的值。 – Fionnuala

+0

非常好。最后一个问题现在...我如何预先填写优先级字段,以等于用户现有任务的数量? – jdiaz5513

0

知道当前记录的用户名,的TaskID和优先级,你需要运行三个查询:

  • 一是园区当前记录的优先级,将其设置为空或零或为其他值移动记录。
  • 然后通过改变方式中的记录来制作空间。
  • 最后将停放的记录移入其新的插槽。

移动当前记录了运行其中的每个在VBA:

"UPDATE Tasks SET Priority = 0 WHERE Username='" & MyUsername & "' AND [Task ID]=" & MyTaskID 

"UPDATE Tasks SET Priority = " & MyPriority - 1 & " WHERE Username='" & MyUsername & "' AND Priority=" & MyPriority + 1 

"UPDATE Tasks SET Priority = " & MyPriority + 1 & " WHERE Username='" & MyUsername & "' AND Priority = 0" 

交换+1和-1 s到走另一条路。

如果在unername/priority上没有唯一索引,那么可以用两个查询来完成,但我建议您添加一个。您也可以在多用户环境中将它们包装在交易中以保证一定的安全性。