【问题标题】:Is there any way I can ask queries to Notes Database有什么方法可以查询 Notes 数据库
【发布时间】:2014-01-31 13:23:15
【问题描述】:

我正在处理给定两个日期的会议:例如获取当前月份的所有会议。

假设我在指定时间段内有大约 45 次会议。我的网络服务需要很多时间。 这就是我现在的做法:

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

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

  3. 如果有任何会议在指定时间段内进行,我将构建一个数组并返回该数组。

这对吗?

【问题讨论】:

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


    【解决方案1】:

    这种方式是正确的,但是效率很低。更好地使用 NotesDatabase- 类并创建一个 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...但这将比您的版本性能更高。

    【讨论】:

    • 如果您使用&lt; 而不是&lt;= 作为每个术语的第二个条件并跳到下个月的第一天(而不是需要找出这个月的最后一天)。
    • 非常好的评论!我用那个建议改进了我的答案!
    【解决方案2】:

    这是正确的,但当您有很多文档时性能不是很好。基本上,您将创建一个视图,其中第一列是会议(开始)日期,已排序。在 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() 方法。

    【讨论】:

      【解决方案3】:

      如果您使用的是 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()。这样可以省去以后的麻烦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多