2014-09-11 30 views
2

我們必須根據文檔中的某些字段值來完成一些任務,包括一些計算(遞歸計算)。比方說,創建一些發票。Xpages如何獲取/創建此計算模塊

在一些古老的經典蓮花筆記應用程序中,我們只創建了一個24行4列的表格,每個單元格都是可編輯/計算的字段。考慮到當前字段行基於前一個字段行的值等等,您可以想象我們在每個字段中輸入了什麼樣的公式。

在xpages中,我的方案是創建一個按鈕,顯示發票結構所在的對話框。完成所有字段,然後保存/隱藏對話框,文檔。 <發票>將在主文檔內的(嵌入)視圖中列出。當前打開的對話框/發票將考慮以前的發票值。顯然,會有一些缺點,我注意到的第一個是:讓我的觀點列出5張發票。如果我打開編輯第二個,我修改了一些字段=>從第三個到最後一個,在最後一次編輯時都會改變嗎?

有沒有我能得到啓發的任何示例片段或這種類型的計算的簡單模塊?

我想要一些建議和一些有用的提示/建議。另外,我會欣賞我應該提防的任何重要考慮事項。

回答

3

這是XPage和重複控制有益的典型示例。

在舊的Notes表單上,您將添加24行4列。想想如果有人需要創建25張發票,或計算/隱藏 - 一列錯誤,或者需要另一列,則需要考慮所涉及的開銷。

重複控制允許您構建一個佈局的實例並動態地迭代2,20,200行。你可以使用一個對話框,或者通過一個按鈕添加相應的鍵(一個文檔的UNID,一個鍵,如果你正在構建一個Java對象的Map)到一個作用域變量的按鈕,就可以編輯/不可編輯一行;那麼如果viewScope變量是當前行的鍵,那麼這些字段是可編輯的,否則不可以。

添加其他行很簡單 - 更改行值或添加頁面。添加一個額外的列很容易 - 只做一次,完成所有事情。每行都沒有隱藏時間公式,所以不會出現錯誤。計算指向該行的數據,而不是具有「_1」,「_2」,「_3」等的字段。如果計算需要更改,則執行一次,然後完成所有行。

+0

謝謝。如果我使用視圖面板,這也是可能的,對嗎? – 2014-09-11 09:30:10

+0

「所以使用這種方式(重複控件)從非常簡單的去到非常複雜的。」對我來說,使用的viewPanel足夠 – 2014-09-11 09:45:16

+1

視圖面板的限制是它只能綁定到數據源dominoView。 dominoView數據源是隻讀的。所以綁定到dominoView的列的可編輯控件將只能是隻讀的。您需要映射到底層的dominoDocument數據源,並且需要在每個列中執行此操作。所以你最終不會綁定到列,而是將控件添加到每個列並綁定這些列。考慮到視圖面板只是一個受約束的重複控件,更好的做法是使用映射到NotesDocumentCollection的重複控件。 – 2014-09-11 12:02:36

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值「訂單項」是使用由dominoDocument定義來創建一個NotesDocument的數據源,這是我們通過VAR是指它的定義一個NotesViewEntry對象(訂單項)(itemdoc )。那有意義嗎?我可能不需要第二層抽象,但這就是代碼傳遞給我的方式。

+0

但是,我應該綁定重複控制內的2個字段?我的重複控制也將其值設置爲sessionScope,現在我想將該值設置爲視圖。 – 2014-09-16 12:13:01

+0

將控件綁定到視圖中顯示的文檔上的字段,而不是綁定到sessionScope值,因爲它永遠不會保存在Notes文檔中,否則會在會話結束時消失。 – 2014-09-16 16:05:37

+0

sessionScope用於增加/刪除repeatControl中的行。如果您有一段時間,我可以向您發送添加行/刪除行按鈕的代碼。 – 2014-09-17 06:31:13