-1

Lotus Notes 응용 프로그램에서 사용자가 작업을 클릭하면 작업은 현재 문서를 처리 할 서버에서 실행중인 에이전트를 호출합니다. 호출 된 에이전트가 실행되지 않는 경우가 있습니다 (서버의 동시 에이전트 제한 때문에 생각합니다). 따라서 5 분마다 호출 된 에이전트가 처리하지 않은 처리 된 문서로 실행되는 유지 관리 에이전트가있는 것입니다. 문제는 때로는 문서가이 두 에이전트에 의해 동시에 처리되어 받아 들일 수없는 결과를 만들어내는 경우입니다.Lotusscript에서 문서 잠금 에뮬레이트

한 번에 하나의 에이전트 만 문서를 처리 할 수 ​​있도록 문서 잠금을 에뮬레이트 할 수있는 방법이 있습니까? 비즈니스 규칙과 관련된 문제가 발생할 수 있으므로 기본 문서 잠금을 사용하지 않습니다. 에이전트 중 하나가 처리 할 때 문서에 태그를 지정하고 처리가 끝난 후 플래그를 지 웁니다. 그러나 문제는 상담원이 동일한 시간에 문서 참조를 보유 할 가능성이 여전히 존재한다는 것입니다 (문서 저장 지연으로 인해).

도와주세요. 감사! : D

+0

디자인을 다시 생각해 보시는 것처럼 들리 겠지만 사용자가 버튼을 클릭 할 때 클라이언트에서 코드를 직접 실행하지 않으시겠습니까? 너무 오래 걸리면 대신 코드를 최적화 할 수 있을까요? 프로파일 러를 사용하여 느린 속도를 확인하십시오. 그렇게하면 모든 일을 피할 수 있습니다. 나는 현재 사용자에게 보여지고있는 문서를 처리하기 위해 run-on-server 에이전트를 사용하지 않는다. –

답변

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