2012-02-14 86 views
2

我希望能夠讓所有用戶創建表單(QCR),但除了我和另一個用戶之外,沒有人應該能夠編輯該表單。我一直在修改ACL和作者和讀者領域,但沒有運氣。在Lotus Notes表單中限制訪問

更多背景信息: 1.此表單是通過單擊單獨數據庫中的按鈕創建的,因爲此QCR表單中的某些信息是從該數據庫繼承的。 2. All組中的用戶應該能夠創建此表格 3.用戶應該能夠讀取QCR數據庫中的所有文檔,但不能編輯它們 4.我和另外一個用戶應該能夠讀取和編輯的所有文件 5.有在QuerySave的事件前,一個文件正在編輯

後比較值的一些代碼我曾嘗試: 我創建了一個組QCR_Access有我和其他用戶1作爲成員。然後我創建了一個作者字段,用'QCR_Access'作爲QCR表格中的公式計算出來。但是,無論我給所有組(存儲者或作者)提供什麼類型的訪問類型,每當我嘗試使用ALL組中的一個用戶保存數據庫中的新文檔時,應用程序都會給我提供錯誤。

以下是Querysave中的代碼,可能會幫助您瞭解我在做什麼。

Sub Querysave(Source As Notesuidocument, Continue As Variant) 
' Compare the values in the form after it is saved with its original values when the document is not a new document.  
Dim doc As NotesDocument 
Set doc = Source.Document 

Dim session As New NotesSession 
Dim user As String 
user = session.CommonUserName 

If newDoc Then 
    doc.Log_Date = Cstr(Now()) 
    doc.Log_User = user 
    doc.Log_Actions = "New document created." 
Else   
    ' Load fields value to the array 
    lastValues(0) = doc.QCR_Requestor(0) 
    lastValues(1) = doc.QCR_No(0) 
    ... 
    lastValues(31) = doc.QCR_Tracking_Info(0) 

' Compared each value in the array to see if there is any difference 
    Dim i As Integer 
    For i = 0 To 31 
     If lastValues(i) <> originalValues(i) Then    
      Call UpdateLogFields(doc,user,i) 
     End If 
    Next 
End If 
End Sub 

Sub UpdateLogFields (doc As NotesDocument, user As String, i As Integer) 
Dim logDate As NotesItem 
Dim logUser As NotesItem 
Dim logActions As NotesItem 

Set logDate = doc.GetFirstItem("Log_Date") 
Set logUser = doc.GetFirstItem("Log_User") 
Set logActions = doc.GetFirstItem("Log_Actions") 

' a space is needed otherwise the appended text is right next to the border 

Call logDate.AppendToTextList(" " & Cstr(Now())) 
Call logUser.AppendToTextList(" " & user) 

Select Case i 
Case 0: Call logActions.AppendToTextList(" Requestor is changed.") 
Case 1: Call logActions.AppendToTextList(" QCR No is changed.") 
    ... 
    Case 30: Call logActions.AppendToTextList(" Follow Up information is changed.") 
Case 31: Call logActions.AppendToTextList(" Tracking information is changed.") 
End Select 
End Sub 

回答

1

我想你一定一定在這裏使用領域的作者,你的描述完全適合爲目的...我會建議您使用在這種情況下一個角色想,因爲這樣你可以分配給其他人在緊急情況下,或者如果你離開公司...

如果你的ACL設置正確,你只需要在作者字段中添加角色的值「[角色]」我已經附加了一個圖片鏈接如果你檢查它,你的領域應該如何。

http://bp1.blogger.com/T-j3ZLqfNQ/RsQXnWk20uI/AAAAAAAAAic/RBRJdD-wVs4/s1600-h/0.gif

此外,考慮到,如果你寫名字的作者領域,你需要使用的人的全名,否則將無法正常工作

+0

這是更好的方法。角色意味着如果名稱/組更改(只有ACL),則不必在以後更改代碼。 – 2012-02-29 19:09:03

0

如果我下面正確的,即有麻煩保存質量控制審查的形式,是那些不屬於QCR_Access組中,正確的ALL組的成員?考慮到QCR表單上的計算的作者字段設置爲僅允許QCR_Access編輯訪問,這是有道理的。

然後,修復程序將在用戶保存後更新該文檔的作者字段。您可以使用某種在特權較高的用戶帳戶下運行的代理來完成此操作。您也可以使用閱讀器字段將文檔從創建該文檔的用戶「隱藏」到該代理運行之前。

這已經有一段時間了,但我認爲我選擇了一個低安全性的解決方案,當我遇到這種情況時,基本上使用表單事件來防止編輯。在這種情況下,您可以防止在文檔不是新的時候以及用戶不在特定組中時進行編輯。你必須處理QueryOpen和QueryModeChange事件並把邏輯放在那裏。注意:這不是真正的安全。作者和讀者字段是處理文檔安全性的推薦方式。

希望這會有所幫助!

0

你可以把公式對於您的作者字段如下所示:

@If(@IsNewDoc;"All";"QCR_Access"); 

但是,有一個問題。如果常規用戶創建文檔,保存但不關閉文檔,然後嘗試進行更改並再次保存,則第二次保存將失敗。爲了解決這個問題,你可以給用戶存放訪問權限並讓你的querySave代碼檢查Database.CurrentAccessLevel屬性來查看當前用戶是否有存放訪問權限並提示用戶詢問「你確定要保存嗎?你不會能夠做出額外的改變。「

0
  1. Domino目錄(例如)創建兩個ACL組:
    • QCR_Editors
    • QCR_Creators
  2. 把每個人都變成QCR_Creators,只是把自己和其他編輯成QCR_Editors。
  3. 在數據庫訪問控制列表(ACL):(與「刪除文件,」如果需要的話)
    • 給QCR_Editors「編輯」訪問
    • 給QCR_Creators「作者」訪問(「創建文件」只。)

注:

  • 你並不需要使用作者或讀者域的形式或文件上。
  • 創作者將只有一個機會來保存文檔。一旦保存,他們將被鎖定進行進一步的編輯。

如果您需要其他功能(例如允許多次保存直到完成),請告訴我。

- Grant