在另一个DB中设置新文档的doc链接

时间:2013-09-12 13:39:11

标签: lotus-notes lotusscript

我在一个数据库中有一个操作,它将在另一个数据库中创建一个新文档。如果(至少)新文档在保存新文档后立即包含指向原始文档的文档链接,那将非常方便。

为此,我在新文档的表单上创建一个计算的RT项目,并通过脚本在Querysave事件中插入一个doc链接。但是RT项目总是空的。让这个工作的基本步骤是什么?

(注释8.5)

2 个答案:

答案 0 :(得分:2)

您可以使用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事件并在那里设置用户保存文档的标志的原因。在Queryclose,我们创建链接,删除字段“LinkDb”和“LinkUniversalID”并再次保存文档如果设置了保存标记且文档包含字段“LinkDb”。

以下是表单的代码:

(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字段并创建新字段非常重要。

答案 1 :(得分:1)

一个选项是将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)