Lotus notes 向Xpages中的文档添加编号

Lotus notes 向Xpages中的文档添加编号,lotus-notes,xpages,lotus-domino,Lotus Notes,Xpages,Lotus Domino,我需要一些关于这一点的提示,因为我找不到关于这一点的任何东西,虽然这可能很简单,但我想不出一个方法。 好的,所以我需要一个隐藏字段,它会自动计算每个文档的所谓id号,编号必须从00001开始并向前,并且永远不能重复。例如,我创建了一个numberId=00001的文档和另一个创建numberId=00002的文档,如果我删除了第一个或第二个文档,那么第三个创建的文档应该是numberId=00003。无论删除了多少个文档,创建的下一个文档都应该获得最新的numberId并向其中添加1 我希望我清

我需要一些关于这一点的提示,因为我找不到关于这一点的任何东西,虽然这可能很简单,但我想不出一个方法。 好的,所以我需要一个隐藏字段,它会自动计算每个文档的所谓id号,编号必须从00001开始并向前,并且永远不能重复。例如,我创建了一个numberId=00001的文档和另一个创建numberId=00002的文档,如果我删除了第一个或第二个文档,那么第三个创建的文档应该是numberId=00003。无论删除了多少个文档,创建的下一个文档都应该获得最新的numberId并向其中添加1

我希望我清楚我在这里需要什么。我需要一个如何实现这一目标的建议或提示


另外,我不能使用@Unique。

只要您在一台服务器上,这是非常简单的。当您拥有一个集群或复制数据库时,它就会变得非常复杂。对于单服务器情况:


创建一个函数nextNumber(),该函数在SSJS中使用synchronized关键字。将最后一个数字缓存在内存中,并在启动时仅从配置文件文档中读取。您可以在Java或SSJS中实现这一点。Matt在一篇文章中解释了缓存和同步:

只要您在一台服务器上,它就非常简单。当您拥有一个集群或复制数据库时,它就会变得非常复杂。对于单服务器情况:


创建一个函数nextNumber(),该函数在SSJS中使用synchronized关键字。将最后一个数字缓存在内存中,并在启动时仅从配置文件文档中读取。您可以在Java或SSJS中实现这一点。Matt有一篇文章解释了缓存和同步:

我为订单号生成器创建了类似的东西。查看将上次使用的numberId存储在中心文档中,然后在“同步”线程中获取/更新numberId

Declan Lynch已在博客中介绍了该方法:

我为订单号生成器创建了类似的功能。查看将上次使用的numberId存储在中心文档中,然后在“同步”线程中获取/更新numberId

Declan Lynch已在博客中介绍了该方法:

我们通过访问创建的序列号文档来进行文档编号,该序列号文档用于存储下一个编号。下面是我用来访问它的ssjs函数。序列文档有一个Tag字段和一个NextNumber字段。标签通常看起来像“USA-2011-”,所以最后的数字看起来像:“USA-2012-00001”


从querySaveDocument事件或其他适当的事件调用函数

我们通过访问我们创建的序列号文档来进行文档编号,该序列号文档用于存储下一个编号。下面是我用来访问它的ssjs函数。序列文档有一个Tag字段和一个NextNumber字段。标签通常看起来像“USA-2011-”,所以最后的数字看起来像:“USA-2012-00001”


从querySaveDocument事件或其他适当的事件调用函数

我们使用了与本文描述的其他方法类似的方法,在编号控制文档中添加了指定的编号服务器。我最近将其实现到一个JavaBean中,以提高性能和避免冲突(并了解这些事情是如何工作的)

如果发出请求的用户不在编号服务器上,他们会得到一个非常难看的临时编号,但很可能是唯一的,因为它包含以毫秒为单位的时间。编号服务器上运行的代理检测到这些临时编号,并发出正式编号。我们甚至可以选择在发出电子邮件时向请求者发送带有官方号码的电子邮件


由于各种原因,我无法打开此功能的源代码,但您在这里有足够的资源可以尝试。

我们使用了与此处描述的其他方法类似的方法,在编号控制文档中添加了指定的编号服务器。我最近将其实现到一个JavaBean中,以提高性能和避免冲突(并了解这些事情是如何工作的)

如果发出请求的用户不在编号服务器上,他们会得到一个非常难看的临时编号,但很可能是唯一的,因为它包含以毫秒为单位的时间。编号服务器上运行的代理检测到这些临时编号,并发出正式编号。我们甚至可以选择在发出电子邮件时向请求者发送带有官方号码的电子邮件


由于各种原因,我无法打开此功能的源代码,但您在这里有足够的资源可以尝试。

以下是您需要的代码,这些代码基于对问题的一些注释

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库中,然后将其包含在一个简单页面中来测试该函数,该页面运行repeat控件,以重复仅调用该函数的计算字段。这是我的测试页面

<?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>

以下是根据对问题的一些评论,您需要的代码

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将自动删除该值的前导零

你可以去看电影