2012-03-21 30 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

相关问题