我需要一些关于这个的提示,因为我在这方面找不到任何东西,虽然它可能很简单,但我想不出办法。 好吧,所以我需要一个隐藏字段,它会自动为每个文档计算所谓的id号,这些数字必须从00001开始向前,绝不能重复。例如,我创建一个numberId = 00001的文档和另一个创建numberId = 00002的文档,如果我删除了第一个或第二个文档,则第三个创建的文档应该有numberId = 00003.无论删除多少个文档,下一个文档created应该获取最新的numberId并添加1。
我希望我清楚这里需要什么。我需要一个建议或提示,我将如何实现这一目标。
另外,我不能使用@Unique。
答案 0 :(得分: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>
答案 1 :(得分:2)
只要你在一台服务器上就可以了。在您拥有集群或复制数据库的那一刻,它变得尽可能复杂。对于单服务器案例:
创建一个在SSJS中使用synchronized关键字的函数nextNumber()。您将最后一个号码缓存在内存中,并且仅在启动时从配置文件中读取它。你可以用Java或SSJS做到这一点。 Matt有一篇解释缓存和同步的文章:http://mattwhite.me/blog/2009/9/14/on-synchronization-in-xpages.html
答案 2 :(得分:2)
我为订单号生成器创建了类似的东西。查看将最后使用的numberId存储在中央文档中,然后在“synchronized”线程中获取/更新numberId。
Declan Lynch发表了关于该方法的博客: http://www.qtzar.com/blogs/qtzar.nsf/Blog.xsp?entry=in00zx5i0r9c
答案 3 :(得分:1)
我们使用了与此处描述的其他方法类似的方法,并在编号控制文档中添加了指定的编号服务器。我最近将它实现为一个java bean,以改善性能和避免冲突(并了解这些东西是如何工作的)。
如果发出请求的用户不在编号服务器上,他们会得到一个非常难看的临时号码,但很可能是唯一的,因为它包含以毫秒为单位的时间。在编号服务器上运行的代理会检测这些临时号码并发出正式号码。我们甚至可以选择在发出请求时向其发送带有官方号码的电子邮件。
由于种种原因,我无法开源此功能,但您已经足够了,可以试试。
答案 4 :(得分:0)
我们通过访问我们创建的序列号文档来存储下一个号码来记录号码。这是我用来访问它的ssjs函数。序列文档具有Tag字段和NextNumber字段。标签通常看起来像“USA-2011-”,所以最终的数字看起来像是:“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事件或其他一些适当的事件中调用该函数。