Как проверить, что документ уже существует в IBM Domino - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над созданием агента для перемещения отмененных документов в архивную базу данных. Прежде чем копировать в архивную базу данных, я хочу проверить, существует ли документ в архивной базе данных. Есть некоторые документы, основные поля которых совпадают в базе данных, поэтому я не могу использовать эти поля, чтобы проверить, является ли оно тем же самым. Есть ли способ проверить, является ли документ одним и тем же документом в двух базах данных? Я обнаружил, что для одного и того же документа некоторая часть unid одинакова в двух базах данных (например, unid в исходной базе данных: 613D530A7B107F468 52578E9001DCC89 unid в базе данных dest: 85258289002735FB852 578E9001DCC89 ), но я я не уверен, что это правильный флаг.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Для почтовых документов или приглашений на собрания вы можете использовать поле $ MessageID в качестве уникального элемента, на который можно сослаться перед архивированием.Я использовал это в прошлом для заполнения базы данных CRM перепиской с клиентами.Идентификатор сообщения уникален даже для нескольких почтовых баз данных, что помогает свести к минимуму беспорядок.

Итак, что-то вроде этого (не тестировалось, у клиента нет доступного дизайнера) ...

'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
0 голосов
/ 17 мая 2018

Я категорически против любого архивирования агентами.Архивирование должно осуществляться с использованием стандартных параметров и полей архивации Notes.В идеале документ существует только в основной или в архивной базе данных.Когда документ должен быть заархивирован, просто добавьте поле ExpireDate с правильной датой, а архивация должна сделать все остальное (при активации).Нет необходимости перемещать документы самостоятельно.

0 голосов
/ 16 мая 2018

Поскольку unid документов (если не подделан) состоит из части, вычисленной по идентификатору реплики базы данных, и преобразованной временной метки для «созданного», это не является простым совпадением, что «тот же» документ имеет аналогичный unid.

Но это НИЧЕГО, на которое вы можете положиться, и зависит от того, как вы создаете свои документы в архиве.

Если бы вы сделали что-то вроде

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

, тогда юниды не будут иметь ничего общего друг с другом.

Если вы используете doc.CopyToDatabase, это будет зависеть от количества попыток и может привести к

  • одинаковому unid в цели
  • аналогичному unid в цели (сначалакопия документа)
  • совершенно другой unid в целевом объекте (последующие копии)

Чтобы идентифицировать документ, у вас должен быть «ключ» для его поиска.

Один из способов - использовать ТО ЖЕ ВСЕГДА:

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 вы можете вычислить ключ или снова использовать универсальный идентификатор исходного документа в качестве ключа:

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)

, а затем найти архивный документ в результате поиска или, что лучше, из GetDocumentByKey в представлении, отсортированном поArchiveKey:

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

Set docArchive = viwLkp.GetDocumentByKey( strArchiveKey )
...