2011-12-06 123 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上沒有唯一索引,那麼可以用兩個查詢來完成,但我建議您添加一個。您也可以在多用戶環境中將它們包裝在交易中以保證一定的安全性。