Добавление нумерации к документам в Xpages - PullRequest
1 голос
/ 21 марта 2012

Мне нужны некоторые советы по этому вопросу, поскольку я ничего не мог найти по этому вопросу, хотя, возможно, это довольно просто сделать, но я не могу придумать способ.Итак, мне нужно скрытое поле, которое будет автоматически вычислять так называемые идентификационные номера для каждого документа, номера должны начинаться с 00001 и далее и никогда не повторяться.Например, я создаю документ с numberId = 00001 и другой документ, который создает numberId = 00002. Если я когда-либо удаляю первый или второй документ, третий созданный документ должен иметь numberId = 00003. Независимо от того, сколько документов будет удалено, следующий документсозданный должен получить последний номерId и добавить к нему 1.

Надеюсь, я понял, что мне нужно здесь.Мне нужен совет или совет, как мне этого добиться.

Кроме того, я не могу использовать @ Unique.

Ответы [ 5 ]

3 голосов
/ 22 марта 2012

Вот код, который вам понадобится на основе некоторых комментариев к вопросу.

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>
2 голосов
/ 21 марта 2012

Я создал нечто подобное для генератора номера заказа. Посмотрите, как сохранить последний использованный номерId в центральном документе, а затем получить / обновить номерId в «синхронизированном» потоке.

Деклан Линч написал в блоге о методе: http://www.qtzar.com/blogs/qtzar.nsf/Blog.xsp?entry=in00zx5i0r9c

2 голосов
/ 21 марта 2012

Пока вы находитесь на одном сервере, это довольно просто.В тот самый момент, когда у вас есть кластер или реплицирующиеся базы данных, он становится настолько сложным, насколько это возможно.Для случая с одним сервером:

создайте функцию nextNumber (), которая использует ключевое слово synchronized в SSJS.Вы кэшируете последний номер в памяти и читаете его только из документа профиля при запуске.Вы можете сделать это в Java или SSJS.У Мэтта есть статья, объясняющая кеш и синхронизированные: http://mattwhite.me/blog/2009/9/14/on-synchronization-in-xpages.html

1 голос
/ 22 марта 2012

Мы использовали подход, аналогичный описанному здесь, с добавлением указанного сервера нумерации в документ управления нумерацией.Недавно я реализовал его в Java-бине, чтобы улучшить как производительность, так и предотвращение конфликтов (и узнать, как эти вещи работают).

Если пользователь, выполняющий запрос, не находится на сервере нумерации, он получает временный номер, который очень уродлив, но, скорее всего, уникален тем, что включает время в миллисекундах.Агент, работающий на сервере нумерации, обнаруживает эти временные номера и выдает официальный номер.У нас даже есть возможность отправить заказчику электронное письмо с официальным номером при его выдаче.

По разным причинам я не могу открыть эту функцию с открытым исходным кодом, но у вас достаточно здесь, чтобы вы могли ее попробовать.

0 голосов
/ 21 марта 2012

Мы делаем номера документов, получая доступ к документу с порядковым номером, который мы создаем для хранения следующего номера. Вот функция 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 или другого подходящего события.

...