To continue reading for free, register below or login
To read more you must become a member of SearchDomino.com
');
// -->

When Notes/Domino developers say they want to "update the fields" in a Lotus Notes view, they usually mean that they want to cause computed fields to recalculate. Assuming this is what you have in mind, you don't need an agent -- you can do it by creating a toolbar icon or view action that uses the formula @Command([ToolsRefreshSelectedDocs]). Select the documents you want to update and click this icon.
Although the LotusScript was unnecessary in this case, it does give me an excuse to lecture about useful principles of LotusScript programming, so listen up.
First, you should know that the back-end methods (NotesDocument.xxx) pay no attention to the form whatsoever. Using LotusScript or even a Formula agent, you can assign any field with any value -- even the totally wrong datatype, or even make up and assign fields that are not even on the form. Lotus Notes will not complain, nor will it change the values of any other fields that you did not explicitly set, even if they are computed fields based on the field you changed. The form is only used when you edit the document on-screen -- at other times it is ignored (with one exception I describe below).
The nice part is that this gives you total control; the downside is that sometimes you want these things done for you!
To get the fields to compute when you're not editing the document, use the NotesDocument.ComputeWithForm method. You can call this method to compute all the computed field formulas, input translations and validations, and update the document accordingly. Take care using this in a server agent, however, because it may fail for formulas that assume they're running on a Lotus Notes client (e.g., that use @UserName or try to @DBLookup in databases on a different server (which would require the current server to be "trusted" by the remote server) .
Also, if you're updating documents in a view, it's best to use view.AutoUpdate = False to prevent the view being refreshed every time you save a document. Not only is this slow, it can make you lose track of your position in the view. It will make the document you were just working on move to a different spot in the view, because of the changes you made to its fields.
In addition, any time you write a LotusScript agent that handles a lot of documents, use the Delete statement to remove documents from memory after you're done with them. Otherwise, you're filling up your available memory with cached documents.
So the resulting code would look something like this:
Sub Initialize
Dim s As New NotesSession
' declare object variables
Dim db As NotesDatabase
Dim v As NotesView
Dim doc As NotesDocument
Dim docNext As NotesDocument
' instantiate objects
Set db = s.CurrentDatabase
Set v = db.GetView("V_ENG")
v.AutoUpdate = false
Set doc = v.GetFirstDocument
Do Until doc Is Nothing
set docNext =
v.GetNextDocument(doc)
If doc.ComputeWithForm
(True, False) Then
Call doc.Save( False, False )
Else
' a validation formula failed;
I don't know what you would want to do here.
End If
Delete doc ' remove doc from cache
(does not delete from database)
Set doc = docNext
Loop
' refresh the view (don't bother)
' Call v.Refresh
End Sub
Do you have comments on this Ask the Expert Q&A? Let us know.
Related information from SearchDomino.com:
Learning Guide: Formula language
Learning Guide: LotusScript
FAQ: LotusScript
FAQ: Formula language
Reference Center: LotusScript tips and resources
Reference Center: Formula language tips and resources
|