如何检查IBM Domino中已存在的文档

时间:2018-05-16 07:27:09

标签: lotus-domino

我正在创建代理以将取消的文档移动到存档数据库,在复制到存档数据库之前,我想检查文档是否已存在于存档数据库中。有一些文件'主要字段在数据库中是相同的,因此我无法使用此字段来检查它是否是同一个字段。有没有办法检查文档是否是两个数据库中的同一文档?我发现,对于相同的文档,UNID的某些部分是在两个数据库相同(例如:UNID在源数据库:613D530A7B107F468的 52578E9001DCC89 UNID在dest数据库:85258289002735FB852的 578E9001DCC89 ),但我不确定这是不是一个正确的旗帜。

3 个答案:

答案 0 :(得分:4)

由于文档的unid(如果没有被篡改)由从数据库副本ID计算的部分和“已创建”的转换时间戳组成,这不是纯粹的巧合,“相同”文档具有类似的unid。

但这并不是您可以信赖的,取决于您在存档中创建文档的方式。

如果您做了类似

的事情
Set docArchive = New NotesDocument( dbArchive )
Call doc.CopyAllItems( docArchive, True )

然后unids就没有任何关系了。

如果您使用doc.CopyToDatabase,则取决于尝试次数,可能会导致

  • 目标中的unid
  • 目标中的类似unid(文档的第一份副本)
  • 完全不同的目标unid(后续副本)

要识别您的文档,您必须拥有一个“密钥”才能找到它。

一种方法是使用SAME universalid:

Set docArchive = New NotesDocument( dbArchive )
Call doc.CopyAllItems( docArchive, True )
docArchive.Universalid = doc.Universalid
Call docArchive.Save()

然后你可以检查是否存在:

On Error Resume Next
Set docArchive = dbArchive.getDocumentByUnid( doc.UniversalID )
On error Goto 0
If Not docArchive is Nothing then 'EXISTS
    ....
End If

如果您不想直接使用universalid,可以计算密钥或再次使用源文档的universalid作为密钥:

Set docArchive = doc.CopyToDatabase( dbArchive )
strArchiveKey = doc.Universalid
'or compose unique key from 3 individual fields:
strArchiveKey = doc.getItemvalue( "OneField" )(0) & "-" & doc.getItemvalue( "AnotherField" )(0) & "_" doc.getItemvalue( "YetAnotherField" )(0)
Call docArchive.ReplaceitemValue( "ArchiveKey", strArchiveKey  )
Call docArchive.Save(True, True, True)

然后从搜索中找到存档文档,或者从ArchiveKey排序的视图中的GetDocumentByKey中找到更好的存档文档:

Set docArchive = db.Search( {ArchiveKey = "} & strArchiveKey & {"}, Nothing, 0).getFirstDocument()

Set docArchive = viwLkp.GetDocumentByKey( strArchiveKey )

答案 1 :(得分:1)

对于邮件文档或会议邀请,您可以使用$ MessageID字段作为归档前要引用的唯一项目。我过去曾用它来为客户通信提供CRM数据库。即使在多个邮件数据库中,邮件ID也是唯一的,这有助于将混乱降至最低。

所以,这样的事情(没有经过测试,没有设计师客户端可用atm)......

'you should have the destination db and the current doc as an object already

dim searchFormula$
dim collDestination as NotesDocumentCollection
dim docDestination as NotesDocument

'of course you could use a lookup view in the destination
'database instead using the less performant db.search

searchFormula$ =|$MessageID="|+cstr(docCurrent.getItemValue("$MessageID")(0))+|"|
set collDestination = dbDestination.search(searchFormula$, Nothing,1)

if not collDestination is Nothing then
 'do nothing or return document already in target database
 'set docDestination = collDestination.getFirstDocument()
else 
  'copy only if doc in destination db not found
  set docDestination = docCurrent.copytoDatabase(dbDestination)
end if

答案 2 :(得分:0)

我强烈反对代理人任何归档。应使用标准Notes归档选项和字段处理归档。理想情况下,文档仅存在于主数据库或存档数据库中。当文档必须存档时,只需添加一个具有正确日期的字段ExpireDate,存档应该完成剩下的工作(激活时)。无需自己移动文档。