我在View Control上使用自定义页脚;我有例如:
显示 1 - 25 34200
我的基础视图已分类,因此条目总数也应包含类别。 到目前为止,我能够找到包括类别在内的条目总数的唯一方法是使用NotesViewNavigator;但是,性能是不可接受的,因为计算这段代码需要大约27秒。
我确定问题出在第var nav:NotesViewNavigator = view1.createViewNav();
行,因为我添加了一些调试器信息:
start = new Date().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel = getComponent("dataView1");
var nav:NotesViewNavigator = view1.createViewNav();
if (viewScope.VendorSrch == "" || viewScope.VendorSrch == null){
var total = nav.getCount();
}else{
var total = viewPanel1.getRowCount();// View can be filtered by user as well (using categoryFilter property)
}
var from =(viewPanel1.getFirst() < total? (viewPanel1.getFirst() + 1 ) : total);
var tmpTo = viewPanel1.getFirst() + viewPanel1.getRows();
var to = (tmpTo < total? tmpTo : total);
var elapsed = new Date().getTime() - start;
print(elapsed + " ms");
"</b>Displaying <b>"+ from +"</b> - <b>"+ to + "</b> of " + "<b>"+total+"</b>"
有谁知道如何改进这段代码?
请注意,此视图中的文档也包含“读者”字段,这些字段可能会影响 这项行动的表现。
答案 0 :(得分:3)
你被困在performance hell。读取访问保护仅存储在文档中。因此,当您要求您的视图导航器获取计数时,唯一的选择是打开所有涉及的文档 - 因此性能不佳。阅读保护和性能是天生的敌人(想象一下:你有一个办公室,每个门都被锁定,你可以随时移动,如果你有一个具有相应锁定号码的钥匙,你必须每次检查所有钥匙。)
读者领域的出路是性能地狱只读取你真正需要的条目(as outlined)。如果用户可以访问基于名称,组成员身份和角色的文档(每次访问可以进行一次读取),那可能会有点棘手,但它仍然非常可行。在这种情况下,您将使用重复控件和对象数据源或托管bean,因此多次传递发生在后台。
奖金技巧:如果你添加一个公式为1的列(只是数字)并将其添加,同时对其进行分类,那么你可以从naventry跳到下一个兄弟(这将是下一个类别)并添加数字 - &gt;所涉及的阅读少得多,没有文件打开。
再次强调:nav.count需要打开所有文档并且是一个不好的想法,任何需要检查读取权限的东西都是一个坏主意,所以使用一个(或多个)viewNav基于实际只读取的访问权限用户可以阅读的文件是要走的路。
如果您需要更多提示,请告诉我
答案 1 :(得分:0)
我尝试了几种方法,使用此循环将时间从平均27秒减少到2.7秒:
start = new Date().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel = getComponent("dataView1");
var nav:NotesViewNavigator = view1.createViewNav();
nav.setEntryOptions(NotesViewNavigator.VN_ENTRYOPT_NOCOLUMNVALUES);
// disable autoupdate
view1.setAutoUpdate(false);
if (viewScope.VendorSrch == "" || viewScope.VendorSrch == null){
nav.setBufferMaxEntries(400);
//var total = nav.getCount(); // This works but slow
// peform lookup
var vwentry:NotesViewEntry = nav.getFirst();
var vwentrytmp:NotesViewEntry = null;
count = 0;
while (vwentry != null){
count = count + 1;
// Get entry and go recycle
vwentrytmp = nav.getNext(vwentry);
vwentry.recycle();
vwentry = vwentrytmp;
}
total = count;
}else{
var total = viewPanel1.getRowCount();
}
var from =(viewPanel1.getFirst() < total? (viewPanel1.getFirst() + 1 ) : total);
var tmpTo = viewPanel1.getFirst() + viewPanel1.getRows();
var to = (tmpTo < total? tmpTo : total);
var elapsed = new Date().getTime() - start;
print(elapsed + " ms");
"</b>Displaying <b>"+ from +"</b> - <b>"+ to + "</b> of " + "<b>" + total + "</b>"