We're not exactly sure what triggers the locks, but the server crashed sometimes several times a day, so we decided to see if the import routines could be optimized to do as few writes as possible.
Several of the routines saved documents even if there were no field changes. I wrote a simple class to test for field value changes.
'// Used to test if certain fields have changed
Class FieldChangeChecker
Private fieldsToCheck As Variant
Private fieldValues List As Variant
'// Run this after calculcation/etc. to see if specified fields have changed
Function haveFieldsChanged( doc As NotesDocument ) As Boolean
On Error GoTo bubbleError
If doc.isNewNote Then
haveFieldsChanged = True
Exit Function
End If
Dim initialValue As Variant, currentValue As Variant
ForAll fieldName In Me.fieldsToCheck
initialValue = Me.fieldValues( fieldName )
currentValue = doc.getItemValue( fieldName )(0)
If initialValue <> currentValue Then
haveFieldsChanged = True
Exit Function
End If
End ForAll
Exit Function
bubbleError:
Error Err, errorMessage()
End Function
'// Comma separate field names. E.g. "forename,surname"
Sub New( ByVal commaSeparatedFieldNames As String )
On Error GoTo bubbleError
Me.fieldsToCheck = FullTrim( Split( commaSeparatedFieldNames, "," ) )
Exit Sub
bubbleError:
Error Err, errorMessage()
End Sub
'// Run this before calculation/etc.
Sub readInitialValues( doc As NotesDocument )
On Error GoTo bubbleError
ForAll fieldName In Me.fieldsToCheck
Me.fieldValues( fieldName ) = doc.getItemValue( fieldName )(0)
End ForAll
Exit Sub
bubbleError:
Error Err, errorMessage()
End Sub
End Class
Example of use:
..
Dim fieldChangeChecker As New FieldChangeChecker( "FirstName,LastName,Address,PostCode,City" )
Set customerDoc = customersView.getFirstDocument()
While Not customerDoc Is Nothing
Call fieldChangeChecker.readInitialValues( customerDoc )
'// Code that looks up the newest information and sets fields
If fieldChangeChecker.haveFieldsChanged( customerDoc ) Then
Call dataDoc.Save(True, False)
End If
Set customerDoc = customersView.getNextDocument( customerDoc )
Wend
..
Regarding the errorMessage-function in the class. I use error bubbling in all my LS code. If something fails somewhere in a routine, I want the routine to stop executing. At the top of the stack, I use OpenLog/LogError. This gives me a nice pseudo stack of the function calls.Code for errorMessage function:
Function errorMessage As String
'// Simple function to generate more readable errors when dealing with error-bubbling
Dim message As String
message = Error
If CStr( GetThreadInfo(10) ) = "INITIALIZE" Then
errorMessage = "Error " & Err & " on line " & Erl & " in function " & GetThreadInfo( 10 ) & ": " + Error
Else
errorMessage = Chr(13) + Chr(9) + "Error " & Err & " on line " & Erl & " in function " & GetThreadInfo( 10 ) & ": " + Error$
End If
End Function