在具有重复控件的表中显示类别总计

时间:2014-09-16 13:31:01

标签: xpages

我有两个类别的视图。

第一个类别是分支名称,我从组合框中选择并存储在viewScope变量中。

第二个是年份,应该是我的表格的行标题。 每个月都有12个其他列,类似于一年中的一个月。

这是我的视图,红色矩形是我想在表格中复制的结果。

s

这是我目前在重复控制数据源上的进展。但我不确切知道如何在计算字段上使用它。

    <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>

1 个答案:

答案 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之外测试类(单元测试!)。

希望有所帮助。
注意:输入我的代码。可能包含拼写错误和语法问题