1

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

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

(注 8.5)

4

2 回答 2

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事件并在那里设置用户保存文档的标志。在我们创建链接时,如果设置了保存标志并且文档包含字段“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 字段并创建新字段非常重要。

于 2013-09-12T14:50:42.757 回答
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)
于 2013-09-12T14:26:09.927 回答