在Lotusscript中模拟文档锁定

时间:2012-11-08 09:33:17

标签: lotus-notes lotus-domino lotusscript agents background-agents

在我的Lotus Notes应用程序中,当用户单击某个操作时,该操作将调用将处理当前文档的运行时服务器代理。调用的代理有时不会运行(我认为这是因为服务器的并发代理限制)。这就是为什么每隔5分钟就有一个维护代理程序运行到未被调用的代理程序处理的已处理文档。问题是,有时,这两个代理同时处理文档,产生不可接受的结果。

有没有办法可以模拟文档锁定,这样文档一次只能由一个代理处理?我不喜欢使用本机文档锁定,因为可能会出现业务规则问题。当其中一个代理处理文档时,我尝试标记文档,然后在完成后清除标记。但是这里的问题是代理商仍然有可能在同一时间获得文档引用(可能是由于保存文档的延迟)。

请帮帮我。谢谢! :d

1 个答案:

答案 0 :(得分:1)

是的,这并不难。创建一个锁定文档,其中包含锁定文档。它们实际上只需要包含被锁定文档的UNID。

当您的代理开始处理文档时,请检查是否存在锁定文档。如果没有,请创建一个。 如果有,请暂时等待或跳过该文档。 文档处理完毕后,删除锁定文档。

这是微不足道的。当我们还在Notes / Domino 5上时,我甚至编写了一个简单的类来处理我的一个应用程序中的文档锁定。下面的代码引用了另一个脚本库中的一些函数和变量,但是你明白了。我相信您可以轻松修改代码以便为您工作。

Option Public
Option Declare
Use "Functions.Globals"


Class DocumentLock
    Private lockdb As NotesDatabase
    Private lockview As NotesView
    Private lockdoc As NotesDocument
    Private lockservername As String
    Private lockdbname As String
    Private lnpdoc As NotesDocument ' Document to lock/unlock

    Public Sub New(doc As NotesDocument)
        me.lockservername = globals.GetValue("LockServer")
        me.lockdbname = AppHomeDir + globals.GetValue("LockDBname")
        If me.lockdb Is Nothing Then
            Set me.lockdb = New NotesDatabase(me.lockservername, me.lockdbname)
        End If
        Set me.lockview = me.lockdb.GetView("LockedDocs")
        Call me.lockview.Refresh()
        Set me.lnpdoc = doc
    End Sub

    Public Sub LockMe()
        Set me.lockdoc = New NotesDocument(me.lockdb)       
        me.lockdoc.Form="Locked"
        me.lockdoc.LockUNID=me.lnpdoc.UniversalID
        me.lockdoc.LockUser= globalcurrentusername 
        me.lockdoc.LockTime=Str(Now())
        me.lockdoc.ClaimNumber = me.lnpdoc.GetItemValue("ClaimNumber")(0)
        me.lockdoc.DocumentForm = me.lnpdoc.GetItemValue("Form")(0)
        Call me.lockdoc.Save(True,True)
    End Sub

    Public Sub UnlockMe()
        Call me.lockview.Refresh()
        Set me.lockdoc = me.lockview.GetDocumentByKey(me.lnpdoc.UniversalID)
        If Not me.lockdoc Is Nothing Then
            Call me.lockdoc.Remove(True)
            Call me.lockview.Refresh()
        End If
    End Sub

    Public Function IsLocked(flagShowInfo As Boolean) As Boolean
        Call lockview.Refresh()
        Set me.lockdoc = me.lockview.GetDocumentByKey(me.lnpdoc.UniversalID)
        If me.lockdoc Is Nothing Then
            me.IsLocked = False
        Else
            me.IsLocked = True
            If flagShowInfo = True Then
                MsgBox "Document locked " & locktext & "." & Chr$(13) & "Please wait a while and try again.."
            End If
        End If
    End Function

    Public Function LockText() As String
        LockText = "by " & LockUserName() & " at " & me.lockdoc.LockTime(0) 
    End Function

    Public Function LockUserName() As String
        Dim lockedby As String
        lockedby = me.lockdoc.LockUser(0)
        If lockedby = globalcurrentusername Then
            LockUserName = "you"
        Else
            LockUserName = lockedby
        End If
    End Function

End Class