有什么方法可以向Notes数据库询问查询

时间:2014-01-31 13:23:15

标签: lotus-notes lotus-domino lotus domino-designer-eclipse

我正在筹集两个日期的会议:例如获取当月的所有会议。

假设我在指定期间内约有45次会议。我的网络服务花了很多时间。 这就是我现在正在做的事情:

  1. 我在日历视图中获取所有文档。

  2. 检查所有文件的开始日期和结束日期。

  3. 如果任何会议属于指定时间段,我正在构建一个数组,我将返回该数组。

  4. 这是对的吗?

3 个答案:

答案 0 :(得分:3)

这种方式是正确的,但非常低效。更好地使用NotesDatabase-类并创建一个Query以与search-method一起使用: 这是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 ......但这比您的版本更高效。

答案 1 :(得分:0)

这是正确的,但是当你有很多文件时效果不是很好。基本上,您将创建一个视图,第一列是会议(开始)日期,已排序。在LotusScript中,您可以访问视图,设置与开始日期匹配的第一个会议的“光标”,然后逐步通过视图,直到结束日期之后的日期为止。

了解view的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()方法。

答案 2 :(得分:0)

如果您使用的是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,则可以使用相同名称和相同方法的类。

关于上述代码的一些警告:

  1. 它不处理重复条目的细微差别。您可以在同一时间范围内拥有重复条目的多个实例。在Notes中,这些条目可能具有相同的UNID。您应该使用重复的条目测试您的代码,以确保您了解细微差别。
  2. 该示例不会按原样回收Document,NotesCalendarEntry和NotesCalendar对象。为简单起见,我跳过了这一点,但如果您使用的是Notes Java类,则必须正确使用recycle()。它将为您带来麻烦。