Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Как избежать возникновения конфликтов при работе с документами в вебе

Александр Ерёмин
Оказывается, очень просто, и даже несколько способов опишу:
1. Стандартный.
Делаем wqs-агента, а в нем небольшой цикл (на примере организации нумерации, больная тема для всех кто начинаетработать с лотусом):
flag = False
While flag = False
next_v=doc.getitemvalue(fieldName$)(0)
If next_v="" Then next_v=0
next_v=next_v+1

mask = "00000"
CurrentNum = Left$(mask, Len(Cstr(mask)) - Len(Fulltrim(Str(next_v)))) + Cstr(next_v)

Call doc.Replaceitemvalue(fieldName$, Cstr(next_v))
flag = doc.Save (False, False)
Set doc = Nothing
Set doc = dc.Getfirstdocument()
Wend

Изюминка в
flag = doc.Save (False, False), а именно в (False, False)! Первый параметр в значении False заставляет обращаться за разрешением конфликта в случае, если документ был кем-то отредактирован (сохранён), ко второму параметру, который при значении False отменяет сохранение (метод save возвращает false).
В случае несохранения документа пользователю нужно вернуть сообщение об ошибке

2. На основе js framework'а (да любого, но пример с jQuery)
Открыли мы документ, оставили его на 10 мин, тем временем кто-то его изменил, возвращаемся, вносим свои изменения, сабмитим форму и - опля, конфликт! Как быть?
А быть так, на сабмит формы сделать небольшую проверку, для этого:
1. На форме вычисляем js-переменную даты и времени последнего изменения документа и размещаем ее в header страницы, а также и ID документа.
2. Делаем агентика, который запустится перед сабмитом формы и заберет последнее время изменения документа, но уже из базы!!! и вернет нам его в JSON.
Итак, у нас есть два "последних" времени изменения документа, нам осталось их сравнить
3. Как раз перед сабмитом формы, например так:

$.getJSON("PreventConflicts?OpenAgent", {DocID: frm.DocID.value, rnd:Math.random()}, function(data){
if (docLastModified==data.sLastModified) {frm.submit();} else {alert('После того как вы открыли документ, кто-то сохранил его. Переоткройте документ.')}
});


В приведённом фрагменте кода
DocID - идентификатор открытого документа, rnd - случайное число, предотвращающее кеширование, docLastModified - переменная в хедер страницы с датой и временем изменения на момент открытия, data.sLastModified - то что нам возвращает агентик в JSON. Сравниваем и делаем нужные манипуляции....
 
  Опубликовано — 05/25/2009 |    

lmike, 09.06.2009 21:24:37:
на сервере можно узнавать через очереди,
таймаут на операцию выставить (скока ждать будет след. код)

можно создавать/удалять доки в базе, но, мне кажется, накладно

VladSh, 09.06.2009 15:22:36:
Написал, а потом почитал - ничего непонятно)
Короче (раскрывая "секреты")))): запросная система + внесение изменений по запросам только сервером + своя блокировка (если док залочен сервером, то в т.ч. этим сервером менять его нельзя, т.к. м.б. его меняет другой агент; брать в цикле заново из базы и постоянно проверять - не выход, - только повод для "повешения" сервера)).

VladSh, 05.06.2009 12:12:24:
"с другой стороны, если идет интенсивная работа с документом и все это под веб, то думается мне избежать конфликтов не реально"
Под веб или не под веб - не играет никакой роли.
Реально и уже лет 7 работает без сбоев.
Лочить конечно же надо. Но не перед открытием дока, а перед самим внесением изменений.
Для веб выход - дать возможность вносить изменения в документ только одному "человеку" - серверу :-)

Александр Ерёмин, 05.06.2009 03:54:37:
хех, хорошо, тогда можно этим же способом во время открытия документа лочить его (либо своими силами, либо встроенными), а разлочивать при unload странички.
с другой стороны, если идет интенсивная работа с документом и все это под веб, то думается мне избежать конфликтов не реально.

VladSh, 04.06.2009 12:12:02:
Вообще же избежание конфликтов, по моему, самая интересная тема в Нотесе!

VladSh, 04.06.2009 12:09:41:
1. flag = doc.Save (False, False) - это самый культурный метод исключения конфликтов.

2.
"Делаем агентика, который запустится перед сабмитом формы и заберет последнее время изменения документа, но уже из базы!!! и вернет нам его в JSON."
А если агент вернёт то же самое время, а потом, до сабмита, документ успеет кто-то изменить? Ситуация хоть и редкая, но реальная;м мы через это уже проходили - в год на большом проекте такое случается от 5 до 10 раз. Чтобы отлавливать и разгребать сбои вручную необходимо иметь специальный механизм... вообще же мало приятного.

"После того как вы открыли документ, кто-то сохранил его. Переоткройте документ."
А если с доком ведётся интенсивная работа? Сколько раз будет вылетать такое сообщение?
Например ген.дир. утвердил документ и ему вылетает такое сообщение... вряд ли он поймёт все технические сложности, и правильно(!) - он утвердил, и его не должны парить какие-то проверки. О5 же из личного опыта.



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU