以编程方式刷新备注空闲时间/日历条目

时间:2014-11-12 11:14:31

标签: xpages lotus-notes

我们正在使用一个小的JavaScript库来通过XPage在个人备注日历中创建新的日历条目。所有应用程序用户都可以选择可用的空闲时间。但是,最近我们注意到空闲时间实际上也显示了实际安排会议的时间。此时,如果我们手动刷新日历然后正确显示所有空闲时间,但是,我们希望找到一种以编程方式刷新它的解决方案。

我试图在线查找但没有成功,所以任何帮助都会非常感激。

编辑1 - 详细说明

我们使用Ulrich Krause here提供的脚本库来创建新的日历条目。此外,在前端,我们有一个重复控制来显示所有的空闲时间。只是为这个想法提供一个小片段:

// This codes shows all the free time for the field named "members" in the main document

try{
var infoDoc:NotesDocument= database.getDocumentByUNID(context.getUrlParameter('refId'));
var meetingDuration = infoDoc.getItemValueInteger("meetingDuration");
var start:NotesDateTime = session.createDateTime(getComponent("startF").getValue());
var end:NotesDateTime = session.createDateTime(getComponent("endF").getValue());
var window:NotesDateRange = session.createDateRange();
window.setStartDateTime(start);
window.setEndDateTime(end);
// Set up the names
var names = new java.util.Vector();
var infoDoc:NotesDocument= database.getDocumentByUNID(context.getUrlParameter('refId'));
names = infoDoc.getItemValue("members");
// Find the free time
var freetime:java.util.Vector = session.freeTimeSearch(window,meetingDuration, names, false);
return freetime;
}catch(err){
view.postScript("alert('"+err+"')")
}

我们面临的问题是,即使在创建日历条目(通过提到的脚本库)之后,它仍会在空闲时间显示,直到从NOTES手动刷新。我们打算以编程方式执行此操作但没有成功。

编辑2:答案选择

最后经过3个小时的调试和标记并取消标记文档中所有缺少的字段后,我发现我在实际代码中制作了一个小BLUNDER。 “$ BusyPriority”硬编码为'2'而不是'1',这也是文档在Freetime中显示的原因之一。其他原因肯定是@Frantisek Kossuth所建议的那样,创造时缺少了刷新的东西。

此外,在调试期间(仅针对结果)我发现通过脚本创建的约会文档仅包含46个字段,而日历文档中的72个字段通过日历创建(或通过日历保存),但是,缺少的字段对文件没有任何重大影响。

3 个答案:

答案 0 :(得分:1)

执行此类开发有一些困难,因为日历条目具有服务器使用的一些内部字段。我非常确定您正在创建的文档缺少一个或多个需要的字段,并且当您执行打开文档并保存文档时会计算这些字段。

我建议你在创建之后转储完整的文档,并在你刷新"之后#34;在Lotus Notes上。然后,您可以使用BeyondCompareWinMerge等工具对其进行比较,并检查您需要的字段。

以防万一,我在LotusScript中使用这个旧代码将文档转储到文本文件中。我希望这很有用。

Public Sub DumpDocToTextFile(doc As NotesDocument, ByVal s_file As String)
    Dim o_item As NotesItem
    Dim v_value As Variant
    Dim s_value As String
    Dim b_first As Boolean
    Dim i_file As Integer
    Dim v_items As Variant
    Dim a_result() As String
    Dim v_result As Variant

    ReDim a_result(0 To 0) As String

    ForAll it In doc.Items
        Set o_item = it

        s_value = ""
        b_first = True

        v_items = o_item.Values
        v_value = Evaluate({""})

        If IsArray(v_items) Then
            ForAll s In v_items
                If b_first Then
                    v_value = Evaluate("{" + CStr(s) + "}")
                    b_first = False                     
                Else
                    v_value = ArrayAppend(v_value, CStr(s))
                End If
            End ForAll

            s_value = Implode(v_value, s_sep)
        Else
            s_value = CStr(o_item.Values)
        End If

        a_result(UBound(a_result)) = o_item.Name + ";" + Format$(o_item.LastModified, "yyyy-mm-dd hh:nn:ss") + ";" + CStr(o_item.Type) + ";""" + s_value + """"
        ReDim Preserve a_result(0 To UBound(a_result) + 1) As String
    End ForAll

    'v_result = sort(a_result)  '<== Use a sort algorithm here. It will be easier compare between two documents.
    v_result = a_result  '<== Comment this line if you have the sort algorithm

    i_file = FreeFile
    Open s_file For Output As i_file

    ForAll r In v_result
        Print #i_file, r
    End ForAll

    Close i_file        
End Sub

答案 1 :(得分:1)

根据评论,您需要的是查看刷新。该片段使用“($ ApptUNID)”视图,因此在创建条目之后使用这样的代码(您需要为邮件文件路径/服务器提供正确的参数):

  try {
        var v:NotesView = db.getView('($ApptUNID)');
        if (v) {
              v.refresh();
        }
  } catch(e) {
      //add error handler
  }

琐事:Ulrich的片段在删除条目时包含view.refresh()来电,但不会创建一个......

答案 2 :(得分:0)

如果您要使用Notes日历执行任何操作,则应将此书签保留为正式发布的模式:http://www-10.lotus.com/ldd/ddwiki.nsf/dx/cs_schema_toc

该页面由C&amp; S开发和支持团队创建,以帮助记录尽可能多的项目(在我们的业余时间)。

此外,如果您担心忙碌时间,则无需手动刷新$ ApptUNID等视图。 Busytime 使用它。该系统完全是自包含的,并在日历上更新条目时从条目中提取数据。

最后,您应该考虑使用9.0中正式发布的C&amp; S API,并在每个维护版本中使用新功能或错误修复进行了更新。 API将为您处理许多丑陋的细节,例如制作重新安排通知等。