添加两个数字字段并显示在另一个数字字段上

Adding two number fields and displaying on another one

我有以下基本 xpage。我想在 reg1 和 over1 上添加字段并将其显示在 total1 上。 我想我必须更新 over1 字段以反映新值或类似的值。它总是显示 0。 有什么想法吗?

<?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>
    <xp:dominoDocument var="document1" formName="TestHrs"></xp:dominoDocument>
</xp:this.data>
<xp:table style="width:383.0px">
    <xp:tr>
        <xp:td>Regular</xp:td>
        <xp:td>Overtime</xp:td>
        <xp:td>Total</xp:td>
    </xp:tr>
    <xp:tr>
        <xp:td>
            <xe:djNumberTextBox id="reg1"
                value="#{document1.rgHr1}">
            </xe:djNumberTextBox>
        </xp:td>
        <xp:td>
            <xe:djNumberTextBox id="over1"
                value="#{document1.ovHr1}">

                <xe:this.onChange><![CDATA[var reg1 = getComponent("reg1").getValue()
var over1 = getComponent("over1").getValue();
getComponent("total1").setValue(reg1 + over1);]]></xe:this.onChange>
            </xe:djNumberTextBox>
        </xp:td>
        <xp:td>
            <xe:djNumberTextBox id="total1"
                value="#{document1.toHr1}" readOnly="true">
            </xe:djNumberTextBox></xp:td>
    </xp:tr>
    <xp:tr>
        <xp:td>
            <xe:djNumberTextBox id="reg2"
                value="#{document1.rgHr2}">
            </xe:djNumberTextBox>
        </xp:td>
        <xp:td>
            <xe:djNumberTextBox id="over2"
                value="#{document1.ovHr2}">
                <xe:this.onChange><![CDATA[#{javascript:var total1 =     getComponent("reg2").getValue() + getComponent("over2").getValue();
getComponent("total2").setValue(total2);}]]></xe:this.onChange>
            </xe:djNumberTextBox>
        </xp:td>
        <xp:td>
            <xe:djNumberTextBox id="total2"
                value="#{document1.toHr2}" readOnly="true">

            </xe:djNumberTextBox></xp:td>
    </xp:tr>
</xp:table>
</xp:view>

我建议不要使用 ssjs,而要使用 csjs。 在同一事件中,但与客户 Javascript 相加,并将总和放入总计字段中。

请记住,作为只读字段,也许您应该检查 属性 "Show disabled control for read-only".

也许您需要在文档的 querySave 事件中进行求和,因为作为只读字段,该值不会更新。不确定。

我发现在 SSJS 中进行更改在 onBlur 或 onKeyUp 上效果最好,并确保我得到一个数字 (isNaN)。 CCJS可能会更好,从这里可以看出linkhttp://www.bleedyellow.com/blogs/xpages/entry/how_to_create_column_totals_in_xpages_view_and_repeat_controls?lang=en

我将 post 放在下面以获得更好的答案。而且这不是我的post,而是我留作参考的。

干杯, 布莱恩

在 Notes 视图中,添加列总计相当容易,但如何在 XPages 视图控件或重复控件中完成此操作?我花了 2011 年的 Lotusphere 一趟才找到答案。 示例:

我们需要总计: 1. 即使 table 正在动态调整大小时,仍将 right-aligned 保留在正在合计的列下方。 2.显示页面上显示的文档的总值 1.这个例子我们需要给view或者repeat控件的标签添加一个panel:

<xp:viewPanel id="viewPanel1">
     <xp:this.facets>
          <xp:panel xp:key="footer" id="totals1">
               <xp:tr>
                   <xp:td colspan="7"></xp:td>
                   <xp:td>
                        <xp:text escape="true" id="computedField1">
                    </xp:td>
                   <xp:td colspan="2"></xp:td>
                   <xp:td>
                        <xp:text escape="true" id="computedField2">
                    </xp:td>
                   <xp:td>
                        <xp:text escape="true" id="computedField3">
                    </xp:td>
                 </xp:tr>
             </xp:panel>
       </xp:this.facets>

诀窍在面板的xp:key 属性 中。将此设置为 "footer",就像您希望在页脚中显示的分页控件所做的那样,允许您添加额外的行。在构成视图或重复控件的 table 的最后一行中,我们放置了计算字段。 (请注意,此示例假定标题为 'Value' 的列之前有 7 列) 2. 假设我们在 XPage 上提供了一个组合框,以允许用户过滤将在视图或重复控件中显示的文档。 使用 Firebug,我们可以看到 XPages 为每个组件创建了一个动态 ID 和名称。对于组合框,它是 view:_id1:_id2:_id94:comboBox1。 但是请注意,自定义控件上的所有组件都分配了相同的前缀 'view:_id1:_id2:_id94:' 到我们给组件的名称:

所以我们可以将下面的client-side Javascript代码添加到我们组合框的'On Change'事件中:

var fcast = 0;
var i = 0;
var id_prefix = "#{id:comboBox1}".split("comboBox1")[0];
while (dojo.byId(id_prefix+"repeat1:"+i+":inputText3")) {
    var it3= dojo.byId(id_prefix+"repeat1:"+i+":inputText3").innerHTML;
    it3 = it3.replace("$","").replace(/,/gi,"");
    fcast = fcast + parseFloat(it3);
    i++;
}
var tot = formatCurrency(fcast);
dojo.byId(id_prefix+"computedField1").innerHTML = tot;

第三行使用“#{id:comboBox1}”来[=44​​=]在运行时给comboBox1字段的完整id。请注意,如果放在脚本库中,此代码将不起作用。 while 循环从第 0 行(第一行)开始,循环遍历 view/repeat 控件上存在 inputText3 字段的每一行。 Firebug 显示值被呈现为 span 标签,因此我们需要使用 .innerHTML 来获取和设置值。 需要使用 replace 方法删除 $ 和逗号,以便可以累加总数。 最后,formatCurrency 函数四舍五入到小数点后两位,并用 $ 和逗号重新格式化总计。 (这是一个自定义函数,此处未显示。) 可以为 computedField2 和 computedField3 创建类似的代码。 因此,如果您的客户需要一个显示列总计的报表,或者甚至需要一个包含显示总计的过滤器的报表,您可以使用这些技术。 向 Paul Hannan 和 Marie Kehoe 致敬,因为他们是这个解决方案的催化剂。