Найти документ Lotus Notes на основе значения поля

У меня есть поле "JobID", которое должно быть уникальным в базе данных заметок. Мой план состоит в том, чтобы найти в базе данных JobID документа и, если он равен JobID текущего документа, предупредить пользователя и отменить сохранение. Я не могу понять, как бы я это сделал, хотя.


person James Hush    schedule 25.09.2012    source источник
comment
новый совет пользователя - если вы найдете какой-то ответ полезным, вы можете принять / проголосовать за него.   -  person Piotr Wadas    schedule 25.09.2012
comment
При этом будет более одной реплики базы данных? Если будет, то все, что пытается проверить уникальность, должно это учитывать.   -  person David Navarre    schedule 26.09.2012


Ответы (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
person Karl-Henry Martinsson    schedule 26.09.2012

Самостоятельное управление уникальным номером может привести к неприятностям. Существует формула @Unique, которая вернет вам уникальное значение, и вам, вероятно, следует использовать ее вместо этого.

В качестве альтернативы вы можете поддерживать в базе данных один документ, содержащий числовое значение, которое вы каждый раз увеличиваете вручную. Это больше работы, но дает вам что-то вроде автоматически увеличивающегося идентификатора, который есть в реляционных базах данных.

person Ken Pespisa    schedule 25.09.2012
comment
Я не беспокоюсь о 100% уникальном идентификаторе. По сути, руководители проектов в прошлом работали над одним и тем же проектом и оба случайно создали новую форму с одним и тем же идентификатором задания. Например. Менеджмент говорит Бобу и Синди создать заказ на 101-ABC. Вместо того, чтобы Боб создавал форму, а Синди редактировала ее, Боб и Синди оба создают формы с JobID 101-ABC, после чего все не понимают, какую форму использовать. По сути, я хочу, чтобы Lotus предупредил Синди о том, что 101-ABC уже существует, чтобы она знала, что нужно снова открыть форму, созданную Бобом. - person James Hush; 25.09.2012
comment
хороший момент, но чтобы УЗНАТЬ, что Боб только что использовал 101-ABC, вам все равно нужно проверить это, именно тогда, когда Синди вводит ее, что на самом деле приводит к той же проблеме :) Если вы не злитесь и не предупреждаете Синди КАЖДЫМ JobID Боб употребляет, а ты нет, верно? :) - person Piotr Wadas; 25.09.2012
comment
Я всегда рекомендую @Unique. Все остальное имеет слишком большую вероятность дублирования. Все, что меньше 100% уникальности, на самом деле вовсе не уникально. Серьезно. Либо вы позволяете им выбирать то, что они хотят, рискуя дублированием, либо всегда запрещаете дублирование. - person David Navarre; 26.09.2012

Я первый признаю, что это довольно уродливо, но эффективно и очень просто, если у вас есть представление, в котором первый столбец — это 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.

Надеюсь, это поможет вам вдохновиться :-) Фил

person Phil M Jones    schedule 25.09.2012
comment
Вы должны быть осторожны с этим в формуле проверки, потому что, если документ уже сохранен, и кто-то пытается отредактировать и повторно сохранить его, формула найдет существующий документ в представлении и предотвратит его повторное сохранение. Один из способов сделать это — использовать параметр [ReturnDocumentUniqueId] ATDbLookup, сверять результат с ATDocumentUniqueId и выдавать ATFailure, только если они не совпадают. - person Richard Schwartz; 25.09.2012
comment
Справедливое предупреждение, однако... В некоторых старых версиях Domino была ошибка, которая могла привести к падению сервера, если агент обновляет поля для формы, которая использует [ReturnDocumentUniqueId]. Эта проблема обсуждается в этой технической заметке IBM: www-01.ibm.com /support/docview.wss?uid=swg21201399 - person Richard Schwartz; 25.09.2012
comment
Хорошо заметил Ричарда. Другим вариантом может быть использование: @If(!@IsNewdoc; @Success; @Do(‹..все вышеперечисленное..›)) )? - person Phil M Jones; 26.09.2012
comment
Основная проблема с этим - проблемы при проверке реплики. Если бы идентификатор задания содержал некоторую ссылку на сервер, на котором оно создано, это не было бы столь тревожным. - person David Navarre; 26.09.2012

Хм, боюсь, нет другого пути, кроме как перебрать все документы в базе данных, которые используют определенную форму, содержащую ваше поле. Гораздо более эффективным способом вместо повторения каждый раз было бы сохранение используемого идентификатора задания в двух местах - с документом и в каком-то хранилище, содержащем все используемые идентификаторы задания, - тогда вы могли бы проверить с помощью собранного набора и/или, возможно, выполнить сканирование всего документа в выключенном состоянии часов для обеспечения целостности данных. Вы можете сузить поиск, используя какое-то конкретное пользовательское представление, и перебирать документы в этом представлении вместо всех документов в БД, однако такое решение будет сопряжено с риском, что с несколько поддельной интеграцией данных вы попадете в беду.

person Piotr Wadas    schedule 25.09.2012

person    schedule
comment
Не могли бы добавить некоторые пояснения? - person Phantômaxx; 17.06.2014