我正在创建代理以将取消的文档移动到存档数据库,在复制到存档数据库之前,我想检查文档是否已存在于存档数据库中。有一些文件'主要字段在数据库中是相同的,因此我无法使用此字段来检查它是否是同一个字段。有没有办法检查文档是否是两个数据库中的同一文档?我发现,对于相同的文档,UNID的某些部分是在两个数据库相同(例如:UNID在源数据库:613D530A7B107F468的 52578E9001DCC89 UNID在dest数据库:85258289002735FB852的 578E9001DCC89 ),但我不确定这是不是一个正确的旗帜。
答案 0 :(得分:4)
由于文档的unid(如果没有被篡改)由从数据库副本ID计算的部分和“已创建”的转换时间戳组成,这不是纯粹的巧合,“相同”文档具有类似的unid。
但这并不是您可以信赖的,取决于您在存档中创建文档的方式。
如果您做了类似
的事情Set docArchive = New NotesDocument( dbArchive )
Call doc.CopyAllItems( docArchive, True )
然后unids就没有任何关系了。
如果您使用doc.CopyToDatabase
,则取决于尝试次数,可能会导致
要识别您的文档,您必须拥有一个“密钥”才能找到它。
一种方法是使用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,存档应该完成剩下的工作(激活时)。无需自己移动文档。