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

Xpages 以编程方式刷新Notes空闲时间/日历条目,xpages,lotus-notes,Xpages,Lotus Notes,我们使用一个小型javascript库,通过XPages在personal notes日历中创建新的日历项。所有应用程序用户都可以选择可用的空闲时间。然而,最近我们注意到空闲时间实际上也显示了实际安排会议的时间。此时,如果我们手动刷新日历,那么所有空闲时间都会正确显示,但是,我们希望找到一个以编程方式刷新日历的解决方案 我曾尝试在网上查找,但没有成功,因此非常感谢您的帮助 编辑1-详细说明 我们使用Ulrich Krause提供的脚本库来创建新的日历条目。此外,在前端,我们有一个repeat控件

我们使用一个小型javascript库,通过XPages在personal notes日历中创建新的日历项。所有应用程序用户都可以选择可用的空闲时间。然而,最近我们注意到空闲时间实际上也显示了实际安排会议的时间。此时,如果我们手动刷新日历,那么所有空闲时间都会正确显示,但是,我们希望找到一个以编程方式刷新日历的解决方案

我曾尝试在网上查找,但没有成功,因此非常感谢您的帮助

编辑1-详细说明

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

// 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个小时的调试、标记和取消标记文档中所有缺失的字段后,我发现我在实际代码中犯了一个小错误。“$BusyPriority”被硬编码为“2”而不是“1”,这也是该文档仍在空闲时间显示的原因之一。另一个原因是@Frantisek Kossuth明确指出,在创作过程中缺少了刷新功能


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

进行这种类型的开发有一些困难,因为日历条目有一些服务器使用的内部字段。我敢肯定,您正在创建的文档缺少一个或多个所需的字段,这些字段是在您执行诸如打开文档并保存文档之类的操作时计算出来的

我建议您在创建完完整文档之后,以及在LotusNotes上“刷新”之后,转储完整文档。然后,您可以使用或之类的工具比较它们,并检查需要哪些字段

以防万一,我在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
公共子转储doctotextfile(doc作为NotesDocument,ByVal s_文件作为字符串)
将o_项目标注为NotesItem
变分v_值
将s_值设置为字符串
Dim b_首先作为布尔值
将i_文件设置为整数
尺寸v_项目作为变型
将结果()变暗为字符串
变分v_结果作为变量
将a_结果(0到0)重拨为字符串
对于所有文档项目
设置o_item=it
s_值=“”
b_first=正确
v_items=o_item.Values
v_值=计算({“”})
如果是排列(v_项),则
对于v_项中的所有s
如果你先来的话
v_值=评估(“{”+CStr+“}”)
b_first=错误
其他的
v_值=阵列附件(v_值,CStr)
如果结束
端孔
s_值=内爆(v_值,s_sep)
其他的
s_值=CStr(o_项目值)
如果结束
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将a_结果(0到UBound(a_结果)+1)保留为字符串
端孔

“v_result=sort(a_result)”根据评论,您需要的是视图刷新。代码段使用“($ApptUNID)”视图,因此在创建条目后,请使用如下代码(您需要为邮件文件路径/服务器提供正确的参数):


琐事:Ulrich的代码段包含删除条目时调用的
view.refresh()
,但不用于创建条目…

如果要使用Notes日历执行任何操作,则应将此书签保留在正式发布的架构中:

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

此外,如果担心繁忙时间,则不需要手动刷新$ApptUNID之类的视图。Busytime不使用它。该系统是完全独立的,在日历上更新条目时从条目中提取数据


<>最后,您应该考虑使用9正式发布的C&S API,并在每个维护版本中更新新的特征或bug修复。API将为您处理许多难看的细节,如制作重新安排通知等。

请提供更多信息。我无法判断您的问题是服务器任务、数据库视图还是文档内容……我们刚刚用一些更详细的描述更新了代码。任何反馈都将非常感谢..谢谢。。!“手动刷新笔记”是指。。。文档重新保存,刷新视图?从NOTES手动刷新意味着打开日历并点击F5按钮(我相信刷新日历条目视图)有一个新的日历API。你试过那个吗?好吧,我们不能这样做,因为我们没有文档句柄,除非我们刷新视图。所以基本上我可以在刷新后将其转储到文本文件中,而不是之前,所以我猜不可能进行比较。另外,Ulrich Krause提供的脚本库(我的问题中有一个链接)非常受欢迎,我怀疑可能会出现遗漏某些字段的错误……你完全正确。刚刚发现某些字段(大约10-13个)缺失,只需要找出其中哪些是标记文档繁忙(不在空闲时间出现)的要求…非常感谢。
  try {
        var v:NotesView = db.getView('($ApptUNID)');
        if (v) {
              v.refresh();
        }
  } catch(e) {
      //add error handler
  }