我们必须根据doc中的一些字段值来完成一些包含一些计算(递归计算)的任务。比方说,创建一些发票。
在一些旧的经典Lotus notes应用程序中,我们刚创建了一个包含24行和4列的表,在每个单元格中都是可编辑/计算字段。您可以想象我们在每个字段中输入的公式类型,考虑到当前字段行基于前一个字段行的值等等。
在xpages中,我的方案是创建一个按钮,显示发票结构所在的对话框。完成所有字段,然后保存/隐藏对话框,文档。 <发票>将列在主文档内的(嵌入)视图中。当前打开的对话框/发票将考虑先前的发票值。显然,会有一些缺点,我首先注意到的是:假设我的视图列出了5张发票。如果我打开编辑第二个,我修改一些字段=>从第3个到最后一个,这个最后的编辑都会改变吗?
我是否可以获得灵感的样本片段或此类计算的简单模块?
我想要一些建议和一些有用的提示/建议。此外,我将理解我应该注意的任何重要考虑因素。
答案 0 :(得分:3)
这是XPage和重复控制有益的一个主要例子。
在旧的Notes表单上,您添加了24行的4列。想想如果有人需要创建25个发票,或者计算/隐藏时间对于一个列是错误的,或者需要另一个列时所涉及的开销。
重复控件允许您构建布局的一个实例,并动态迭代2,20,200行。您可以使用一个对话框,或者通过一个按钮添加相关键(一个文档的UNID,一个键,如果您正在构建一个Java对象的Map)到一个范围变量来创建一个可编辑/不可编辑的行;如果viewScope变量是当前行的键,则字段是可编辑的,否则不是。
添加其他行很简单 - 更改行值或添加页面。添加额外的列很容易 - 只需执行一次即可完成所有操作。每行没有隐藏时间公式,因此没有错误的机会。计算指向该行的数据,而不是带有" _1"," _2"," _3"的字段。如果计算需要更改,请执行一次,并为所有行完成。
答案 1 :(得分:1)
您需要的代码在XPages研讨会简介的练习23中。您可能需要在此处查看: http://www-10.lotus.com/ldd/ddwiki.nsf/m_Home.xsp?documentId=C8E56F876AF2315A852575F60076592B#mobileViewer
我写了
答案 2 :(得分:0)
在我们自己的例子中,我们有请购单,采购订单和付款请求。每个文档都是一个文档,每个文档的每个行项目也是一个文档。然后,主文档上的重复(在您的情况下为发票)引用视图,使用过滤器,以便它只获取该发票的行项目。因此,您可以编辑发票上的行项目(包括重复控件中每个条目上的编辑,保存和取消按钮)并保存它们。
这是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>
因此,重复的var值中的'lineitem'是该dominoDocument定义用于创建NotesDocument数据源的NotesViewEntry对象(lineitem),我们通过它的定义(itemdoc)来引用它。那有意义吗?我可能不需要第二层抽象,但这就是代码传递给我的方式。