【问题标题】:Lotus Notes 7 - copy / move docs. ( parent & response docs ) without changing the UNID ?Lotus Notes 7 - 复制/移动文档。 (父母和响应文档)不更改 UNID 吗?
【发布时间】:2013-06-21 06:40:43
【问题描述】:

我有 2 个数据库:比如说 dbA 和 dbB。实际上,dbB 是 dbA 的“子”数据库,因为它所包含的表单/视图/框架集/等都在 dbA 中。

我现在想从 dbA 的视图(比如说 vwA)复制一些 8K 文档到 dbB 的同一视图(vwA)。这些 8k 包含父文档和子文档,在 dbA 中使用 @Text(@UniqueDocumentID) 列出了 OK。我刚刚做了一个测试,复制一个父文档及其响应,并粘贴到第二个数据库中,但不幸的是,两个文档之间的连接没有建立……我猜 UNID 已经改变了……

有什么解决办法吗?感谢您的宝贵时间。

【问题讨论】:

  • 两点说明:1) 尽量避免使用 UNID 进行引用,2) 调查是否可以使用标准 Lotus 归档(保留 UNID afaik)

标签: copy lotus-notes lotusscript documents


【解决方案1】:

是的,将文档复制到另一个数据库总是会为目标数据库中的文档创建一个新的 UniversalID。

为避免这种情况,您的 LotusScript 应该像这样工作:

  • 在目标数据库中创建新文档
  • CopyAllItems 从源文档到目标文档
  • 为目标文档targetDoc.UniversalID = sourceDoc.UniversalID设置相同的UniversalID
  • 保存目标文档

这样目标文档与源文档具有相同的UniversalID,并且文档之间的链接也应该在目标数据库中工作。

这是处理选定文档的代理的示例:

Dim session As New NotesSession
Dim dbSource As NotesDatabase
Dim dbTarget As NotesDatabase
Dim col As NotesDocumentCollection
Dim docSource As NotesDocument
Dim docTarget As NotesDocument

Set dbSource = session.Currentdatabase
Set dbTarget = session.Getdatabase(dbSource.Server, "YourTargetDatabase.nsf", false)
Set col = dbSource.Unprocesseddocuments
Set docSource = col.Getfirstdocument()
While Not docSource Is Nothing
    Set docTarget = dbTarget.Createdocument()
    Call docSource.Copyallitems(docTarget, true)
    docTarget.UniversalID = docSource.UniversalID
    Call docTarget.save(True, False)
    Set docSource = col.Getnextdocument(docSource)
Wend

【讨论】:

  • 谢谢你,亲爱的克努特。不幸的是,我是 Lotus 编程的新手,我想我需要代码方面的帮助
  • 谢谢,我试试!我有一个问题: 有两个 Set dbSource: Set dbSource = session.Currentdatabase Set dbSource = session.Getdatabase(dbSource.Server, "YourTargetDatabase.nsf", false)。这个可以吗?谢谢克努特!
  • 代理是否在源数据库上运行?谢谢。这两个数据库位于不同的服务器上
  • 是的,这个代理应该在源数据库中定义并运行。您可以更换目标服务器。写"YourTargetServer" 而不是dbSource.Server
  • 和第二组 dbSource 不应该是 Set dbTarget ?
【解决方案2】:

或者,您可以通过设置复制公式让复制为您处理此问题,假设 dbA 和 dbB 是副本。

【讨论】:

    【解决方案3】:

    我认为最简单的方法是创建脚本并使用 NotesDocument 类的 CopyToDatabase 方法复制文档。 CopyToDatabase 方法保留文档的 UniversalID(出于性能原因)。至少对于 R7 之前的版本是这样。

    更多信息可以在这里找到: IBM Technote: Documents copied using CopyToDatabase method reuse same UNID

    一个示例脚本(从 Knut 复制和修改)将是:

    Dim session As New NotesSession
    Dim dbSource As NotesDatabase
    Dim dbTarget As NotesDatabase
    Dim col As NotesDocumentCollection
    Dim docSource As NotesDocument
    Dim docTarget As NotesDocument
    
    Set dbSource = session.Currentdatabase
    Set dbTarget = session.Getdatabase(dbSource.Server, "YourTargetDatabase.nsf", false)
    Set col = dbSource.Unprocesseddocuments
    Set docSource = col.Getfirstdocument()
    While Not docSource Is Nothing
        Set docTarget = docSource.Copytodatabase(dbTarget)
        Set docSource = col.Getnextdocument(docSource)
    Wend
    

    【讨论】:

    • 谢谢你,迈克尔!这也是代理从视图中处理选定文档的示例?
    • 是的,代理使用“UnprocessedDocuments”属性来获取 DocumentCollection。这会处理在视图中选择的文档。如果需要,您可以更改它以处理视图(或类似的任何内容)中的所有文档。
    • 谢谢!我会试一试,稍后再宣布。
    • 我确实在所选文档上运行了代理,它们都已被复制。但是父文档的UNID已经改变了,所以父文档和响应文档之间没有建立关系
    • 对引用的IBM文章的解释是错误的。 Copytodatabase 不保留该单元。它只是将同一文档的 unid 复制多次(如果已删除)...仔细阅读... CopyToDatabase 不是此问题的解决方案
    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多