从 Xpages 中的 "view" 计算父文档
Count Parent Document from a "view" in Xpages
我有一个名为 "View All Topic" 的 table 行,其中有一个计算字段,它指示来自名为 "topic".
的视图的文档总数
此视图是分类视图,没有单独的回复表单。
所以现在我想从此视图中获取文档的总数,但是,我只想 return 父文档计数而不是所有带有响应文档(子文档)的条目。
视图中的文档总数是 6,其中 2 个是 responses.So,除了响应我想检索父文档计数是 4。
我找到了这个 javascript 的解决方案。但是需要知道是否有任何更简单的解决方案。
任何建议将不胜感激。
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:var currentDb:NotesDatabase = session.getCurrentDatabase();
var currentView:NotesView = currentDb.getView("topic");
var docColl:NotesViewEntryCollection = currentView.getAllEntries();
var c = docColl.getCount();
var r =0;
for(i=1;i<=c;i++){
var en:NotesViewEntry = docColl.getNthEntry(i);
var docs:NotesDocument = en.getDocument();
if(!docs.isResponse())
r++;
}
return r;}]]>
</xp:this.value>
<xp:this.converter>
<xp:convertNumber type="number"></xp:convertNumber>
</xp:this.converter>
</xp:text>
嗯嗯,可能有几种方法可以解决这个问题。恭喜,您的代码不是其中之一。您应该不惜一切代价避免使用 "getNthEntry()",因为它的表现很糟糕。如果你确实想坚持你的解决方案,你应该摆脱 for 循环并使用可以执行 getNextEntry(entry) 或 getNextDocument(doc) 的东西。
如果可以的话,最简单的方法可能只是更新视图。 Parent 文档的格式可能与响应不同。因此,您可以添加一列以达到 @if(@contains("form", "myParentForm");1;0)... 之类的效果。所以你 return 如果它是 parent 则为 1,否则为 0。然后设置该列以获取总数,然后使用 NotesViewNavigator class 将该数字拉回。
如果您不想添加列。然后,最好的解决方案可能还是使用 NotesViewNavigator。这应该非常快。您想要导航到第一个条目 - 可能是 Parent。然后循环执行 getnextSibling 以处理任何响应文档。应该有很多例子,但这里有一个:
http://www-12.lotus.com/ldd/doc/lotusscript/lotusscript.nsf/1efb1287fc7c27388525642e0074f2b6/11c5837eb09e23a78525675300720a16?OpenDocument
我想您当然可以创建一个新的隐藏视图,该视图具有相同的选择公式减去接收响应的部分。如果您的视图只有 parents,那么您可以将所有文档或条目放入一个集合中,然后简单地执行 collection.getCount()... 类似的操作。
祝你好运!
我有一个名为 "View All Topic" 的 table 行,其中有一个计算字段,它指示来自名为 "topic".
的视图的文档总数此视图是分类视图,没有单独的回复表单。
所以现在我想从此视图中获取文档的总数,但是,我只想 return 父文档计数而不是所有带有响应文档(子文档)的条目。
视图中的文档总数是 6,其中 2 个是 responses.So,除了响应我想检索父文档计数是 4。
我找到了这个 javascript 的解决方案。但是需要知道是否有任何更简单的解决方案。 任何建议将不胜感激。
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:var currentDb:NotesDatabase = session.getCurrentDatabase();
var currentView:NotesView = currentDb.getView("topic");
var docColl:NotesViewEntryCollection = currentView.getAllEntries();
var c = docColl.getCount();
var r =0;
for(i=1;i<=c;i++){
var en:NotesViewEntry = docColl.getNthEntry(i);
var docs:NotesDocument = en.getDocument();
if(!docs.isResponse())
r++;
}
return r;}]]>
</xp:this.value>
<xp:this.converter>
<xp:convertNumber type="number"></xp:convertNumber>
</xp:this.converter>
</xp:text>
嗯嗯,可能有几种方法可以解决这个问题。恭喜,您的代码不是其中之一。您应该不惜一切代价避免使用 "getNthEntry()",因为它的表现很糟糕。如果你确实想坚持你的解决方案,你应该摆脱 for 循环并使用可以执行 getNextEntry(entry) 或 getNextDocument(doc) 的东西。
如果可以的话,最简单的方法可能只是更新视图。 Parent 文档的格式可能与响应不同。因此,您可以添加一列以达到 @if(@contains("form", "myParentForm");1;0)... 之类的效果。所以你 return 如果它是 parent 则为 1,否则为 0。然后设置该列以获取总数,然后使用 NotesViewNavigator class 将该数字拉回。
如果您不想添加列。然后,最好的解决方案可能还是使用 NotesViewNavigator。这应该非常快。您想要导航到第一个条目 - 可能是 Parent。然后循环执行 getnextSibling 以处理任何响应文档。应该有很多例子,但这里有一个: http://www-12.lotus.com/ldd/doc/lotusscript/lotusscript.nsf/1efb1287fc7c27388525642e0074f2b6/11c5837eb09e23a78525675300720a16?OpenDocument
我想您当然可以创建一个新的隐藏视图,该视图具有相同的选择公式减去接收响应的部分。如果您的视图只有 parents,那么您可以将所有文档或条目放入一个集合中,然后简单地执行 collection.getCount()... 类似的操作。
祝你好运!