2012-03-21 31 views
1

我需要關於這個的一些技巧,因爲我找不到任何關於此的東西,儘管它可能很簡單,但我想不出一種方法。 好的,所以我需要一個隱藏的字段,它會自動爲每個文檔計算所謂的ID號碼,數字必須從00001開始,並且不能重複。例如,我創建了一個numberId = 00001的文檔和另一個創建numberId = 00002的文檔,如果我刪除了第一個或第二個文檔,第三個創建的文檔應該有numberId = 00003。無論有多少文檔被刪除,下一個文檔創建應獲取最新的numberId並添加1。將編號添加到Xpages中的文檔中

我希望我清楚自己需要什麼。我需要一個建議或提示,我將如何實現這一點。

另外,我不能使用@Unique。

回答

3

下面是您需要根據問題的一些評論的代碼。

function simplegetSequentialNumber(){ 
    synchronized(applicationScope){ 
     var newSeqNum:Int = 0; 
     if (applicationScope.containsKey("seqNumber")){ 
      newSeqNum = applicationScope.get("seqNumber") + 1; 
      applicationScope.put("seqNumber", newSeqNum); 
      var seqView:NotesView = database.getView("vw_SequentialNumberStore"); 
      var seqNumberDoc:NotesDocument = seqView.getFirstDocument(); 
      seqNumberDoc.replaceItemValue("seqNumber",applicationScope.get("seqNumber")); 
      seqNumberDoc.save(true,true); 
     } else { 
      var seqView:NotesView = database.getView("vw_SequentialNumberStore"); 
      try { 
       var seqNumberDoc:NotesDocument = seqView.getFirstDocument(); 
       applicationScope.put("seqNumber",seqNumberDoc.getItemValueInteger("seqNumber") + 1); 
       seqNumberDoc.replaceItemValue("seqNumber",applicationScope.get("seqNumber")); 
       seqNumberDoc.save(true,true); 
       newSeqNum = applicationScope.get("seqNumber"); 
      } catch(e) { 
       var seqNumberDoc:NotesDocument = database.createDocument(); 
       seqNumberDoc.replaceItemValue("Form","cPanel"); 
       seqNumberDoc.replaceItemValue("seqNumber",1); 
       applicationScope.put("seqNumber", 1); 
       seqNumberDoc.save(true,true); 
       newSeqNum = 1; 
      } 
     } 
    } 
    var seqNNNN:String = ("0000" + newSeqNum.toString()).slice(-4); 
    return seqNNNN; 
} 

正如你可以先看看它會在同步塊的下一個順序號,增加了一個,然後把數回applicationScope。

然後它將它轉換爲字符串,並添加額外的4個零,然後從中加上正確的4個字符。這將返回一個字符串並需要存儲在文本字段中。您不能將其存儲在數字字段中,因爲Notes會自動從該值中刪除前導零。

您可以通過將其添加到服務器端的JavaScript庫中,然後將其包含在一個運行重複控制來重複調用該函數的計算字段的簡單頁面中來測試此函數。這是我的測試頁面。

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 
    <xp:this.resources> 
     <xp:script src="/seqNum.jss" clientSide="false" /> 
    </xp:this.resources> 
    <xp:repeat id="repeat1" rows="30" value="#{javascript:30}"> 
     <xp:text escape="true" id="computedField1" 
      value="#{javascript:simplegetSequentialNumber();}" /> 
     <xp:br id="br1" /> 
    </xp:repeat> 
</xp:view> 
+0

謝謝你的代碼,但是這隻增加了一個數字...... – gkidd 2012-03-22 13:50:10

+0

我在代碼中發現了一個小錯字,我在第三行中使用了seqNNN而不是seqNNNN。 – 2012-03-22 14:11:58

+0

我已經用一個如何調用它的例子更新了代碼。如果您只能將單個數字保存到文檔中,則意外將該字段設置爲數字字段。您不能在數字字段中存儲0001,筆記會自動將其轉換爲1.您必須將返回的值存儲在文本字段中。 – 2012-03-22 14:13:31

2

只要你在一臺服務器上,它就非常簡單。當你擁有一個集羣或複製數據庫的時候,它會變得很複雜。對於單服務器情況下:

創建函數nextNumber(),其使用在SSJS synchronized關鍵字。您將最後一個號碼緩存在內存中,並且只能在啓動時從配置文件中讀取它。你可以用Java或SSJS來做到這一點。馬特有一篇文章,解釋緩存和synchonized:http://mattwhite.me/blog/2009/9/14/on-synchronization-in-xpages.html

2

我已經創建了一個訂單號生成器類似的東西。查看將最後使用的numberId存儲在中央文檔中,然後在「同步」線程中獲取/更新numberId。

迪克蘭林奇在博客的方法: http://www.qtzar.com/blogs/qtzar.nsf/Blog.xsp?entry=in00zx5i0r9c

+0

嘿每個,我得到它與這種解決方案(它似乎是最簡單的方法)。但我似乎無法調整到我的需要。它工作的很好,但我需要編號去像00001,00002,00003等,而不是1,2,3,4等我怎麼能做到這一點? Tnx的所有幫助的方式:) – gkidd 2012-03-22 09:56:51

+0

使用此解決方案的編號部分,然後添加一些代碼填充您的號碼與所需的零。你可以這樣做:http://www.codigomanso.com/en/2010/07/simple-javascript-formatting-zero-padding/它基本上做一個(「0000」+數字).slice(-5); :-) – 2012-03-22 11:19:09

+0

我被卡住了,我得到它添加四位數字,但它所做的全部數字都是「1」,每當我創建一個文檔時,我都會得到1111. 這就是我到目前爲止的地方: http://pastebin.com/mGtv1Shb 我已經嘗試過「所有事情」,但我想我現在無法真正地思考:) – gkidd 2012-03-22 13:04:22

0

我們通過訪問,我們創建一個用於存儲的下一個數的序列號文件做文件號碼下面是SSJS功能我用它來訪問它。序列文檔有一個Tag字段和一個NextNumber字段。標籤通常看起來像「USA-2011-2015」,所以最後的數字是這樣的:「USA-2012-00001」

function getDocumentNumber(tag:String){ 
    var doc:NotesDocument = document1; 
    if(doc.getItemValueString("DocumentNumber")=="-"){ 
     var seqView:NotesView = database.getView("(Sequence Number)"); 
     var seqNumberDoc:NotesDocument=seqView.getDocumentByKey(tag); 
     var seqnum = seqNumberDoc.getItemValueInteger("NextNumber"); 
     var seqNNNN = @Right("00000" + @Text(seqnum),5); 
     var docNumber:String = tag + seqNNNN; 
     seqNumberDoc.replaceItemValue("NextNumber",seqNumberDoc.getItemValueInteger("NextNumber") + 1); 
     seqNumberDoc.save(true,true); 
     return docNumber; 
    } 
} 

呼叫從該querySaveDocument事件或其他一些適當的活動功能。

+0

邁克,如果你在你的代碼中使用'同步'代碼塊,你可以確保'synchronized'代碼塊內的代碼一次只能執行一次。這將消除兩個(或更多)用戶獲得相同序列號的問題。 – 2012-03-21 19:04:40

+0

@Per這是一個你遇到的問題,當它是一個Web應用程序?我們是做網絡應用的新手。我們從來沒有遇到過使用LotusScript和客戶端的這種方法的任何類型問題。 – 2012-03-23 01:37:04

1

我們已經使用的編號控制文檔中添加指定的編號服務器的這裏所描述的類似的方法來別人。我最近將它實現爲一個java bean,以提高性能和避免衝突(並瞭解這些工作如何工作)。

如果發出請求的用戶不是他們得到一個臨時號碼,這是非常醜陋的編號服務器上,但大部分,它包括以毫秒爲單位的時間可能是獨一無二的。在編號服務器上運行的代理檢測到這些臨時號碼併發出官方號碼。我們甚至可以選擇在發佈時向申請人發送包含官方號碼的電子郵件。

由於各種原因,我不能開源這個功能,但你有足夠的在這裏,你可以試試。

+1

我提倡這個答案,因爲專用編號服務器是大型部署(集羣,集線器/輻射,客戶端副本 - 是的,XPages也是如此)的必備條件。 – 2012-03-22 08:02:15

相關問題