我在一个数据库中有一个动作,它将在另一个数据库中创建一个新文档。如果(至少)新文档在保存新文档后立即包含指向原始文档的文档链接,那将非常方便。
为此,我在新文档的表单上创建了一个计算出的 RT 项,并通过脚本在 Querysave 事件中插入一个文档链接。但 RT 项始终为空。让这个工作的基本步骤是什么?
(注 8.5)
我在一个数据库中有一个动作,它将在另一个数据库中创建一个新文档。如果(至少)新文档在保存新文档后立即包含指向原始文档的文档链接,那将非常方便。
为此,我在新文档的表单上创建了一个计算出的 RT 项,并通过脚本在 Querysave 事件中插入一个文档链接。但 RT 项始终为空。让这个工作的基本步骤是什么?
(注 8.5)
您可以使用rtitem.AppendDocLink(doc, "Title")
创建所需的文档链接。
rtitem
是新创建的文档的 RichText 项。
doc
是第一个数据库中当前选择的文档,它具有用于创建新文档的按钮。
获得令人满意的解决方案是一个小小的挑战。如果我们将以下行放入创建新文档的按钮中
...
Set docSelected = session.DocumentContext
Set docNew = dbTarget.CreateDocument()
Set rtitem = docNew.CreateRichTextItem("Doclink")
Call rtitem.AppendDocLink(docSelected, "Title")
Call docNew.Save(True, True) ' <--- that is necessary :(
...
Call workspace.EditDocument(True, docNew)
然后它会在新文档中创建一个链接,并立即可见。但是,它只有在我们保存新文档时才有效。这可能不是一个好主意,因为即使用户只是关闭文档而不保存,文档也会保留在数据库中。
所以,我们必须寻找另一种解决方案。
让我们转过来,让新文档在用户保存后创建文档链接。为此,我们必须为新文档提供有关链接文档的数据库和 UniversalID 的信息。我们在创建新文档的按钮中执行此操作
Set docNew = dbTarget.CreateDocument()
docNew.LinkDb = session.CurrentDatabase.FilePath
docNew.LinkUniversalID = session.DocumentContext.UniversalID
在新文档的表单中,我们创建了一个计算出来的 RichText 字段“Doclink”。什么时候是用链接填写字段的好时机?正如我发现的那样,Querysave
事件还为时过早。在标准文档保存期间,“Doclink”字段被损坏。解决方案是等到Queryclose
并在那里设置链接。但是,我们应该只在用户保存文档并且只保存一次时才这样做。这就是为什么我们必须监视Querysave
事件并在那里设置用户保存文档的标志。在我们创建链接时,如果设置了保存标志并且文档包含字段“LinkDb” Queryclose
,则删除字段“LinkDb”和“LinkUniversalID”并再次保存文档。
这是表单的代码:
(Declarations)
Dim bSaved As Boolean
Sub Initialize
bSaved = False
End Sub
Sub Querysave(Source As Notesuidocument, Continue As Variant)
bSaved = True
End Sub
Sub Queryclose(Source As Notesuidocument, Continue As Variant)
If bSaved Then
Dim session As New NotesSession
Dim doc As NotesDocument
Dim dbLink As NotesDatabase
Dim docLink As NotesDocument
Dim rtitem As NotesRichTextItem
Set doc = Source.Document
If doc.HasItem("LinkDb") Then
Set dbLink = session.GetDatabase(doc.ParentDatabase.Server, doc.LinkDb(0), False)
Set docLink = dbLink.GetDocumentByUNID(doc.LinkUniversalID(0))
doc.RemoveItem("Doclink")
Set rtitem = doc.CreateRichTextItem("Doclink")
Call rtitem.AppendDocLink(docLink, "Link")
doc.RemoveItem("LinkDb")
doc.RemoveItem("LinkUniversalID")
Call doc.Save(True, True)
End If
End If
End Sub
在添加文档链接之前,删除 RichText 字段并创建新字段非常重要。
一种选择是将旧文档的 NotesDocumentUNID、数据库路径和服务器保存在新文档的三个字段中。
然后在新文档的设计中创建一个按钮,通过这两个字段打开旧数据库中的旧文档。
创建新文档
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim oldDB As NotesDatabase
Dim oldDoc As NotesDocument
Dim newDoc As NotesDocument
Dim newDB As NotesDatabase
Set oldDB = session.CurrentDatabase
Set oldDoc = workspace.CurrentDocument.Document
Set newDB = session.GetDatabase("SERVER", "FILE")
Set newdoc =newdb.CreateDocument
newdoc.oldDocUNID= olddoc.UniversalID
newdoc.oldDBpath=oldDB.FilePath
newdoc.oldDBServer = oldDB.Server
Call newdoc.save(True,False,True)
创建按钮以打开 oldDoc
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim newdoc As notesdocument
Dim oldDB As notesdatabase
Dim oldDoc As notesdocument
Set newdoc = workspace.CurrentDocument.Document
Set oldDB = session.GetDatabase(newdoc.oldDBServer(0),newdoc.oldDBpath(0))
Set oldDoc = oldDB.GetDocumentByUNID(newDoc.oldDocUNID(0))
Call workspace.EditDocument(True,oldDoc)
End Sub
DocLink 选项
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim oldDB As NotesDatabase
Dim oldDoc As NotesDocument
Dim newDoc As NotesDocument
Dim newDB As NotesDatabase
Dim rtitem As NotesRichTextItem
Set oldDB = session.CurrentDatabase
Set oldDoc = workspace.CurrentDocument.Document
Set newDB = session.GetDatabase("SERVER", "FILE")
Set newdoc =newdb.CreateDocument
Set rtitem = newdoc.CreateRichTextItem("body")
Call rtitem.AppendDocLink(olddoc, "title")
Call newdoc.save(True,False,True)