У меня есть поле "JobID", которое должно быть уникальным в базе данных заметок. Мой план состоит в том, чтобы найти в базе данных JobID документа и, если он равен JobID текущего документа, предупредить пользователя и отменить сохранение. Я не могу понять, как бы я это сделал, хотя.
Найти документ Lotus Notes на основе значения поля
Ответы (5)
Вы можете немного сократить свой код, нет необходимости перебирать все документы...
db.Search очень медленный, вместо этого я бы использовал просмотр представления. Вы можете использовать db.FTSearch, но если полнотекстовый индекс не актуален, вы не получите правильное возвращаемое значение. Поэтому просто создайте скрытое представление поиска с идентификатором задания в качестве первого и единственного столбца (отсортированного).
Вы также должны объявить session/db/etc в своей функции. Убедитесь, что вы всегда используете Option Declare...
Function JobIdIsValid (jobId As String) As Boolean
'*** Check if a form with this project number is already created
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim col as NotesDocumentCollection
Dim searchformula As String
Set db = session.CurrentDatabase
Set view = db.GetView("(LookupJobID)")
Call view.Refresh() 'Optional, but useful if documents are created often
Set col = view.GetAllDocumentsByKey(JobID)
If col.Count > 0 Then
JobIdIsValid = False
Else
JobIdIsValid = True
End If
End Function
Самостоятельное управление уникальным номером может привести к неприятностям. Существует формула @Unique
, которая вернет вам уникальное значение, и вам, вероятно, следует использовать ее вместо этого.
В качестве альтернативы вы можете поддерживать в базе данных один документ, содержащий числовое значение, которое вы каждый раз увеличиваете вручную. Это больше работы, но дает вам что-то вроде автоматически увеличивающегося идентификатора, который есть в реляционных базах данных.
Я первый признаю, что это довольно уродливо, но эффективно и очень просто, если у вас есть представление, в котором первый столбец — это JobID.
Put this in the input validation of the JobID field.
outcome := @DbLookup("":"NoCache"; "":"" ; "<viewname>"; JobID; 2);
@If(@IsError(outcome); @Success; @Failure("A Job with this ID already exists").
Или что-то подобное.
Вы также можете сделать что-то намного лучше многими другими способами:
e.g. LotusScript in the Exiting event of the JobID field using
....
set doc= NotesView.GetDocumentByKey(workspace.currentdocument.fieldgettext("JobID"))
If doc Is Nothing Then ....
etc.
Надеюсь, это поможет вам вдохновиться :-) Фил
Хм, боюсь, нет другого пути, кроме как перебрать все документы в базе данных, которые используют определенную форму, содержащую ваше поле. Гораздо более эффективным способом вместо повторения каждый раз было бы сохранение используемого идентификатора задания в двух местах - с документом и в каком-то хранилище, содержащем все используемые идентификаторы задания, - тогда вы могли бы проверить с помощью собранного набора и/или, возможно, выполнить сканирование всего документа в выключенном состоянии часов для обеспечения целостности данных. Вы можете сузить поиск, используя какое-то конкретное пользовательское представление, и перебирать документы в этом представлении вместо всех документов в БД, однако такое решение будет сопряжено с риском, что с несколько поддельной интеграцией данных вы попадете в беду.