2012-02-14 108 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