如何通过LotusScript实现文档复制锁原文档及归档替换逻辑?
LotusScript解决方案:主文档锁定与视图迁移需求实现
针对你提出的两个技术需求,我会逐步修改现有代码并解释逻辑:
需求1:创建副本时自动锁定主文档
在创建副本的按钮代码中,我们需要添加主文档锁定逻辑,同时处理锁定失败的场景(比如文档已被其他用户锁定)。另外,为了后续保存副本时能关联到原主文档,我们会给副本新增一个MainDocUNID字段存储主文档的唯一ID。
修改后的创建副本按钮代码:
Sub Click(Source As Button) Dim ns As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Dim newdoc As NotesDocument Dim dc As NotesDocumentCollection Dim lockSuccess As Boolean Set db = ns.CurrentDatabase Set dc = db.UnprocessedDocuments ' 确保仅选择单个文档 If dc.Count <> 1 Then Messagebox "No or too many documents selected", MB_OK, "Error" Exit Sub End If Set doc = dc.GetFirstDocument ' 尝试锁定主文档,True参数表示等待其他用户释放锁定(可选) On Error Resume Next Call doc.Lock(True) lockSuccess = (Err = 0) On Error GoTo 0 If Not lockSuccess Then Messagebox "Failed to lock the main document. It may be locked by another user.", MB_OK, "Lock Error" Exit Sub End If ' 创建副本并关联主文档 Set newdoc = doc.CopyToDatabase(db) Call newdoc.ReplaceItemValue("PStatus", "Draft") ' 存储主文档的唯一ID,用于后续关联 Call newdoc.ReplaceItemValue("MainDocUNID", doc.UniversalID) Call newdoc.Save(True, False) Messagebox "Copy created successfully and main document locked.", MB_OK, "Success" End Sub
需求2:副本保存后迁移视图并设置生效文档
保存按钮需要完成以下操作:
- 验证密码后,找到当前副本对应的主文档
- 将主文档的状态改为
Archived,使其从Computer视图移至Archived视图 - 将副本的状态改为
Active,使其从Draft视图移至Computer视图(作为生效文档) - 解锁主文档(可选,若归档后无需锁定)
修改后的保存按钮代码:
Sub Click(Source As Button) Dim session As New NotesSession Dim workspace As New NotesUIWorkspace Dim db As NotesDatabase Dim uidoc As NotesUIDocument Dim draftDoc As NotesDocument Dim mainDoc As NotesDocument Dim vpswd As String Set uidoc = workspace.CurrentDocument Set db = session.CurrentDatabase Set draftDoc = uidoc.Document ' 密码验证 vpswd = Inputbox$("Please input code to save:", "Save Verification") If vpswd <> "o" Then Messagebox "Incorrect code. Save cancelled.", MB_OK, "Error" Exit Sub End If ' 通过副本的MainDocUNID找到主文档 Set mainDoc = db.GetDocumentByUNID(draftDoc.MainDocUNID(0)) If mainDoc Is Nothing Then Messagebox "Cannot find the corresponding main document.", MB_OK, "Error" Exit Sub End If ' 处理主文档:修改状态为Archived,解锁并保存 uidoc.EditMode = True Call mainDoc.ReplaceItemValue("PStatus", "Archived") Call mainDoc.Unlock() ' 解锁主文档(若无需永久锁定可保留) Call mainDoc.Save(True, False) ' 处理副本:修改状态为Active,保存并完成操作 Call draftDoc.ReplaceItemValue("PStatus", "Active") Call uidoc.FieldSetText("SaveOptions", "1") Call uidoc.Save() Call uidoc.Close() Messagebox "Save completed. Main document moved to Archived view, copy is now active in Computer view.", MB_OK, "Success" End Sub
视图配置说明
确保你的三个视图的选择公式正确关联PStatus字段:
- Computer视图:选择公式为
SELECT PStatus = "Active" - Draft视图:选择公式为
SELECT PStatus = "Draft" - Archived视图:选择公式为
SELECT PStatus = "Archived"
这样修改字段值后,文档会自动在对应视图间迁移。
内容的提问来源于stack exchange,提问作者Reinhaa
相关产品推荐
相关产品推荐

