Есть ли способ задать вопросы в базе данных Notes?
Я работаю над извлечением собраний с двумя датами: например, извлекаю все собрания текущего месяца.
Предположим, у меня около 45 встреч за указанный период. Мой веб-сервис отнимает много времени. Вот как я это делаю прямо сейчас:
Я получаю все документы в календаре.
Проверьте все документы на дату начала и дату окончания.
Если какое-либо из совещаний попадает в указанный период, я создаю массив и возвращаю этот массив.
Это правильно?
3 ответа
Этот способ правильный, но очень неэффективный. Лучше использовать NotesDatabaseClass и создать Query для использования с методом search: Вот пример в LotusScript (поскольку вы не указываете язык)
Dim ses as New NotesSession
Dim db as NotesDatabase
Dim dc as NotesDocumentCollection
Dim strQuery as String
Set db = ses.CurrentDatabase
strQuery = {Form = "Appointment" & _
(StartDate >= [01.01.2014] & StartDate < [01.02.2014]) | _
(EndDate >= [01.01.2014] & EndDate < [01.02.2014])}
Set dc = db.Search( strQuery , Nothing, 0 )
'- Cycle through this collection...
Конечно, вам нужно динамически корректировать strQuery, собирая его из сегодняшней даты... Но это будет гораздо более производительным, чем ваша версия.
Это правильно, но не очень эффективно, когда у вас много документов. По сути, вы создадите представление с первым столбцом даты встречи (начала), отсортированным. В LotusScript вы можете получить доступ к представлению, установить "курсор" первого собрания, который совпадает с начальной датой, и затем переходить через представление, пока не достигнете даты после конечной даты.
Прочтите о методе GetDocumentByKey представления. Далее здесь: http://publib.boulder.ibm.com/infocenter/domhelp/v8r0/index.jsp?topic=%2Fcom.ibm.designer.domino.main.doc%2FH_LOCATING_DOCUMENTS_WITHIN_A_VIEW_OR_FOLDER.html
Хммм... думая немного дальше, что произойдет, если у вас есть начальная дата, но нет соответствующей встречи... так что обратитесь к методу FTSearch().
Если вы используете Notes / Domino 9.0 или новее, вы должны использовать встроенные классы календаря. Они доступны из LotusScript или Java. Вот пример использования Java. Учитывая объект базы данных и диапазон дат, он печатает все записи в диапазоне:
private static void printRange(Database database, DateTime start, DateTime end) throws NotesException {
// Get the calendar object from the database
NotesCalendar calendar = database.getParent().getCalendar(database);
if ( calendar != null ) {
// Get a list of calendar entries
Vector<NotesCalendarEntry> entries = calendar.getEntries(start, end);
if ( entries != null ) {
// For each entry ...
Iterator<NotesCalendarEntry> iterator = entries.iterator();
while (iterator.hasNext()) {
NotesCalendarEntry entry = iterator.next();
// Read the iCalendar representation
String icalendar = entry.read();
// Get the Notes UNID
Document doc = entry.getAsDocument();
String unid = doc.getUniversalID();
// Print UNID and iCalendar to console
System.out.println("Entry UNID: " + unid);
System.out.println(icalendar);
}
}
}
}
Интерфейсы NotesCalendar и NotesCalendarEntry находятся в пакете lotus.domino. Если вы используете LotusScript, существуют классы с одинаковыми именами и с одинаковыми методами.
Пара предупреждений о приведенном выше коде:
- Он не обрабатывает нюансы повторяющихся записей. Вы можете иметь несколько экземпляров повторяющейся записи в одном и том же диапазоне времени. В примечаниях эти записи могут иметь одинаковый UNID. Вы должны проверить свой код с повторяющимися записями, чтобы убедиться, что вы понимаете нюансы.
- В этом примере объекты корзины, NotesCalendarEntry и NotesCalendar не обрабатываются должным образом. Я пропустил это для простоты, но если вы используете Java-классы Notes, вам определенно нужно правильно использовать recycle(). Это избавит от головной боли в будущем.