Xpages X演示如何获取/创建此计算模块

Xpages X演示如何获取/创建此计算模块,xpages,Xpages,我们必须根据文档中的一些字段值完成一些计算(递归计算)任务。比如说,创建一些发票 在一些经典的LotusNotes应用程序中,我们只创建了一个包含24行4列的表,每个单元格都是一个可编辑/计算字段。您可以想象我们在每个字段中输入了什么样的公式,考虑到当前字段行基于上一个字段行的值,依此类推 在xpages中,我的场景是创建一个按钮,显示发票结构所在的对话框。填写所有字段,然后保存/隐藏对话框、文档发票>将列在主文档内的(嵌入式)视图中。当前打开的对话框/发票将考虑以前的发票值。显然,这会有一些缺

我们必须根据文档中的一些字段值完成一些计算(递归计算)任务。比如说,创建一些发票

在一些经典的LotusNotes应用程序中,我们只创建了一个包含24行4列的表,每个单元格都是一个可编辑/计算字段。您可以想象我们在每个字段中输入了什么样的公式,考虑到当前字段行基于上一个字段行的值,依此类推

在xpages中,我的场景是创建一个按钮,显示发票结构所在的对话框。填写所有字段,然后保存/隐藏对话框、文档发票>将列在主文档内的(嵌入式)视图中。当前打开的对话框/发票将考虑以前的发票值。显然,这会有一些缺点,我首先注意到的是:假设我的视图列出了5张发票。如果我打开以编辑第二个字段,我将一些字段=>从第三个字段修改为最后一个字段,在最后一次编辑时是否会全部更改

是否有我从中得到灵感的示例片段或这种计算的简单模块


我想要一些建议和一些有用的提示/建议。此外,我将感谢任何重要的考虑,我应该小心

这是XPages和repeat控件的最佳示例

在旧的Notes表单上,您将添加24行4列。如果有人需要创建25张发票,请考虑所涉及的开销,或者在一列错误时计算/隐藏,或者需要另一列

重复控件允许您构建布局的一个实例,并动态迭代2、20、200行。您可以使用对话框,或者通过按钮将相关键(文档的UNID,如果您正在构建Java对象的映射,则为键)添加到作用域变量,从而使行可编辑/不可编辑;如果viewScope变量是当前行的键,则字段是可编辑的,否则不可编辑


添加其他行很简单-更改行值或添加页面。添加一个额外的列是很容易的-只需一次就可以了。对于每一行,没有隐藏when公式,因此不存在出错的可能性。计算指向该行的数据,而不是带有“_1”、“_2”、“_3”等的字段。如果计算需要更改,请执行一次,然后对所有行执行该操作。

您需要的代码在XPages研讨会简介的练习23中。您可能希望在此处查看它:


我在我们自己的例子中写了它,我们有请购单、采购订单和付款请求。这些文件中的每一个都是一个文件,这些文件中的每一行项目也都是一个文件。然后,主文档(您的情况下为发票)上的重复引用视图,使用过滤器,以便它仅获取该发票的行项目。因此,您可以编辑发票上的行项目(包括重复控件中每个条目上的编辑、保存和取消按钮)并保存它们

以下是viewEntryCollection的框架,用于使行项目在重复中的面板中可用

<xp:repeat id="repeat1" rows="1000" var="lineItem" indexVar="itemIndex">
    <xp:this.value><![CDATA[#{javascript:var ludb:NotesDatabase = getDb("tamisDb");
var luview:NotesView = ludb.getView("LULineItemsByParentDocID");
var parentDocID = compositeData.parentDocID;
if (parentDocID == null) { parentDocID = "0" };
var vec:NotesViewEntryCollection = luview.getAllEntriesByKey(parentDocID, true);
if (vec.getCount() == 0){
    viewScope.totalProcValue = 0;
}
return vec;}]]></xp:this.value>
    <xp:panel id="lineItemDataPanel">
        <xp:this.data>
            <xp:dominoDocument var="itemDoc" formName="LineItem"
                action="openDocument" documentId="#{javascript:lineItem.getUniversalID()}"
                ignoreRequestParams="true">
                <xp:this.databaseName><![CDATA[#{javascript:getDb("tamisDb")}]]></xp:this.databaseName>
            </xp:dominoDocument>
        </xp:this.data>

要将控件绑定到行项目文档,请使用源文档中的var

<xp:inputText value="#{itemDoc.Description}" id="lineItemEditDescription" style="width:200.0px">
</xp:inputText>


因此,repeat的var值中的“lineitem”是dominoDocument定义用于创建NotesDocument数据源的NotesViewEntry对象(lineitem),该数据源由其定义(itemdoc)上的var引用。这有意义吗?我可能不需要第二层抽象,但代码就是这样传递给我的。

谢谢。如果我使用视图面板也是可能的,对吗?“所以使用这种方法(重复控件)从非常简单到非常复杂。”对我来说,使用视图面板是不够的视图面板的限制是它只能绑定到dominoView数据源。dominoView数据源是只读的。因此,从dominoView绑定到列的可编辑控件将永远是只读的。您需要映射到底层dominoDocument数据源,并且需要在每个列中都这样做。因此,您最终不会绑定到列,而是向每一列添加控件并绑定这些控件。考虑到视图面板只是一个受约束的重复控件,更好的做法是使用映射到NotesDocumentCollection的重复控件。您能看到我的问题吗:。请给我指出正确的方向?我会使用单独的文档或Stephan提到的table walker示例。通过阅读这个问题,我不确定您是否理解如何使用repeat控件,特别是value属性应该是什么,以及从repeat外部与repeat控件的内容交互的复杂性。这超出了StackOverflow的范围。XPages研讨会提供了更新repeat控件内容的几种方法,我相信还有其他示例。基本上,在repeat中处理所有编辑,或者提取repeat之外的所有可编辑内容。谢谢,我会检查它。但是我应该在repeat控件中绑定这两个字段吗?我的repeat控件也将其值设置为sessionScope,现在我想将该值设置为视图。将控件绑定到视图中出现的文档上的字段,而不是sessionScope值,否则它将永远不会保存在Notes文档中,并且在会话结束时将消失。sessionScope用于增加/删除repeatControl中的行。如果您有时间的话,我可以给您发送添加行/删除行按钮的代码。要添加新行项目,我们有一个面板,其中包含行项目的inputText控件,它由一个带有执行document.getElementById(#{id:newItemInputPanel})的onclick的链接“激活”。style.dis