我有两个类别的视图。
第一个类别是分支名称,我从组合框中选择并存储在viewScope变量中。
第二个是年份,应该是我的表格的行标题。 每个月都有12个其他列,类似于一年中的一个月。
这是我的视图,红色矩形是我想在表格中复制的结果。
这是我目前在重复控制数据源上的进展。但我不确切知道如何在计算字段上使用它。
<xp:this.value><![CDATA[#{javascript:var db:NotesDatabase = session.getDatabase("","erpx/report7.nsf", false);
var v = db.getView("(xpChartCostByProjectYear)");
var nav:NotesViewNavigator = v.createViewNavFromCategory(viewScope.project);
var entry:NotesViewEntry = nav.getFirst();
var vAccnt = db.getView("(chartCostByProject)");
var values = []; // create an empty array
while (entry!=null && !entry.isTotal()){
var obj={};
var year =[];
getComponent("computedField3").setValue(nav.getCount())
year.push(entry.getColumnValues().get(1));
obj.year = entry.getColumnValues().get(1);
obj.jan = entry.getColumnValues().get(2);
obj.feb =entry.getColumnValues().get(3);
obj.mar =entry.getColumnValues().get(4);
obj.apr=entry.getColumnValues().get(5);
obj.may=entry.getColumnValues().get(6);
obj.jun=entry.getColumnValues().get(7);
obj.jul=entry.getColumnValues().get(8);
obj.aug=entry.getColumnValues().get(9);
obj.sep=entry.getColumnValues().get(10);
obj.oct=entry.getColumnValues().get(11);
obj.nov=entry.getColumnValues().get(12);
obj.dec=entry.getColumnValues().get(13);
values.push(obj);
var tmpentry:NotesViewEntry = nav.getNextCategory();
entry.recycle();
entry = tmpentry;}
return values;
}]]></xp:this.value>
答案 0 :(得分:2)
您希望在将代码绑定到任何内容之前简化代码。怎么样:
var db = session.getDatabase("","erpx/report7.nsf", false);
var v = db.getView("(xpChartCostByProjectYear)");
var nav:NotesViewNavigator = v.createViewNavFromCategory(viewScope.project);
var dataLabels = ["dummy","year","jan","feb ","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]
var entry:NotesViewEntry = nav.getFirst();
var vAccnt = db.getView("(chartCostByProject)");
var results = []; // create an empty array
while (entry!=null && !entry.isTotal()){
var obj={};
var curVals = entry.getColumnValues();
for (var i=1; i<14; i++) {
obj[dataLabels[i]] = curVals.get(i);
}
results.push(obj);
var tmpentry:NotesViewEntry = nav.getNextCategory();
entry.recycle();
entry = tmpentry;
}
//Cleanup
nav.recycle();
vAccnt.recycle();
db.recycle();
return results;
数据源需要变量名称,例如curRow
。然后你将你的字段绑定到curRow.jan curRow.feb等。
我会尽量避免将值推送到computedField3的副作用。如果您需要这样的东西,最好使用对象数据源。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:this.data>
<xe:objectData var="objectData" readonly="true" scope="view">
<xe:this.createObject><![CDATA[#{javascript:return new com.notessensei.ViewWithTotals("dbName","ViewName")}]]></xe:this.createObject>
</xe:objectData>
</xp:this.data>
<xp:repeat id="repeat1" rows="30" var="curRow"
value="#{javascript:objectData.getRowData(session,viewScope.projectName);}">
<xp:text escape="true" id="computedField1" value="#{curRow.jan}"></xp:text>
<xp:text escape="true" id="computedField2" value="#{curRow.feb}"></xp:text>
</xp:repeat>
</xp:view>
然后你需要一个可以容纳你的结果值的类com.notessensei.ViewWithTotals
,如果你不希望它们在你查看页面时改变它们,你甚至可以缓存它们。
课程看起来大致如下:
package com.notessensei;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.Vector;
import lotus.domino.Database;
import lotus.domino.NotesException;
import lotus.domino.Session;
import lotus.domino.View;
import lotus.domino.ViewEntry;
import lotus.domino.ViewNavigator;
public class ViewWithTotals {
private final String dataLabels[] = {"dummy","year","jan","feb ","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
private final String dbName;
private final String viewName;
private final Map<String,Collection<Map<String,String>>> viewValues = new HashMap<String, Collection<Map<String,String>>>();
private int totals = 42;
public ViewWithTotals(String dbName, String viewName) {
this.dbName = dbName;
this.viewName = viewName;
}
public Collection<Map<String,String>> getRowData(Session session, String catName) {
if (!this.viewValues.containsKey(catName)) {
this.populateViewValues(session, catName);
}
return this.viewValues.get(catName);
}
@SuppressWarnings("unchecked")
private void populateViewValues(Session session, String catName) {
try {
Database db = session.getDatabase(null, this.dbName);
View v = db.getView(this.viewName);
ViewNavigator nav = v.createViewNavFromCategory(catName);
ViewEntry ve = nav.getFirst();
Collection<Map<String,String>> result = new Stack<Map<String,String>>();
while (ve != null) {
ViewEntry nextVe = nav.getNextSibling(ve);
Map<String, String> oneEntry = new HashMap<String, String>();
Vector val = ve.getColumnValues();
for (int i = 1; i < 14; i++) {
oneEntry.put(this.dataLabels[i], val.get(i).toString());
}
result.add(oneEntry);
ve.recycle();
ve = nextVe;
}
this.viewValues.put(catName, result);
nav.recycle();
v.recycle();
db.recycle();
} catch (NotesException e) {
// TODO Fix this
e.printStackTrace();
}
}
// Exercise left to the reader...
public int getTotals() {
return this.totals;
}
}
虽然这是一个更多的工作,它应该给你a)更好的性能(你可以有一个refresh()方法来清除存储的值)和b)你可以添加你可以用来绑定到其他字段的其他值(就像这里的总数)。它提供了最好的灵活性。
一种体验:使用依赖注入(如:提供会话作为参数),因此您也可以在XPage之外测试类(单元测试!)。
希望有所帮助。
注意:输入我的代码。可能包含拼写错误和语法问题