Режим ожидания

  • Автор темы Lexa-xa
  • Дата начала
L

Lexa-xa

Суть вопроса.
Допустим пользователь открыл документ (основной или response) и в течение некоторого времени не редактировал там ничего, а другому пользователю необходимо открыть этот же документ, соответственно он (документ) уже находится в режиме "Открыт", и второму пользователю необходимо ждать пока первый его закроет.
Собственно сама задача состоит в том, чтобы по истечении некоторого промежутка времени, в течении которого не было произведено каких-либо изменений документ был закрыт с сохранением.

Конечно есть вариант в каждое поле, при событии OnChange, допустим, прописать, что поле изменилось, но это как-то очень-очень уж трудоемко, и практически не реализуемо.

Может у кого-нить есть мысли, как эту штуку реализовать. Заранее премного благодарен.
 
A

Axel

Чисто теоретически по открытии дока можно запускать серверного агента с таймером.... Но это чисто теоретически, потому что практически одновременно на сервере могет крутится максимум 10 агентов....

Но вдруг кого на мысль хорошую наведет)))
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Есть класс NotesTimer. Посмотри в хелпе пример.
 
L

Lexa-xa

Чисто теоретически по открытии дока можно запускать серверного агента с таймером.... Но это чисто теоретически, потому что практически одновременно на сервере могет крутится максимум 10 агентов....

Но вдруг кого на мысль хорошую наведет)))

Самое главное - это "поймать" документ в момент последнего редактирования, в этом-то скорее всего и состоит проблема.
 
A

Axel

<!--QuoteBegin-Lexa-xa+10:07:2006, 15:54 -->
<span class="vbquote">(Lexa-xa @ 10:07:2006, 15:54 )</span><!--QuoteEBegin-->Самое главное - это "поймать" документ в момент последнего редактирования, в этом-то скорее всего и состоит проблема.
[snapback]39823" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ставишь NotesTimer в документе скажем на срабатывание каждую минуту. По таймеру получаешь коллекцию всех полей (Item-ов) дока и проверяешь у этих Item-ов свойство LastModified. Находишь самое большое время и отсчитываешь от текущего времени собственно сколько времени назад был изменен док. Если этот промежуток больше чем установлено, то сохраняешь и закрываешь док. :(
 
L

Lexa-xa

Ставишь NotesTimer в документе скажем на срабатывание каждую минуту. По таймеру получаешь коллекцию всех полей (Item-ов) дока и проверяешь у этих Item-ов свойство LastModified. Находишь самое большое время и отсчитываешь от текущего времени собственно сколько времени назад был изменен док. Если этот промежуток больше чем установлено, то сохраняешь и закрываешь док. :(

Сейчас надо будет протестировать данный вариант.
.......

Протестировал. LastModified показывает последнюю дату изменения только после сохранения документа (может что-то не правильно сделал), в том числе, даже если значение в поле не изменилось, то все-равно устанавливается новая дата (чего не очень бы хотелось).
 
A

Axel

Для: Lexa-xa

Мда, LAstModified действительно не отрабатывает как хотелось бы. Надо искать какой-то другой способ.

Можно конечно по простому у всех Item-ов документа взять Text, собрать в одну строку и сохранить в какую-нить промежуточную переменную. На следующем шаге собрать такую же строку и сравнить с полученной на предыдущем шаге.

Или чтоб не хранить строку здоровую хранить ее хэш.
 
L

Lexa-xa

Конечно, можно брать все Итемы и проверять их, но их порядка 300, в одной форме, и довольно-таки проблематично, скорее всего будет все тормозить.
Может быть попробовать при помощи On Event

Пробую делать
On Event PostRecalc From Source Call getFieldValue
в PostOpen на это не то.
Как бы мне отловить процесс вхождения в поле и после. По идее хотелось бы использовать
On Event Entering From Field Call getFieldValueEnter, а потом
On Event Exiting From Field Call getFieldValueExit, но для этого надо установить связь с Field.

Будем думать.

А можно сделать такую штуку (другой вариант это задачи).
Тоже через промежуток времени (чтоб не проверять, редактировались поля или нет) вывести Сообщение, на подобе MsgBox(), которое закрывалось бы САМО, если пользователь не реагирует на него, т.е. допустим пользователь отошел, а тут бац и сообщение (ну например на 10 секунд) и через это время сообщение убирается и дальше идет обработка по моему усмотрению (скорее всего закрытие документа или что-нить еще).
 
A

Axel

<!--QuoteBegin-Lexa-xa+12:07:2006, 15:06 -->
<span class="vbquote">(Lexa-xa @ 12:07:2006, 15:06 )</span><!--QuoteEBegin-->Как бы мне отловить процесс вхождения в поле и после. По идее хотелось бы использовать
On Event Entering From Field Call getFieldValueEnter, а потом
On Event Exiting From Field Call getFieldValueExit, но для этого надо установить связь с Field.
[snapback]40013" rel="nofollow" target="_blank[/snapback]​
[/quote]

Это не проблема:

Sub Entering(Source As Field)
глобальная переменная = uidoc.FieldGetText( uidoc.CurrentField )
End Sub

Sub Exiting(Source As Field)
If uidoc.FieldGetText( uidoc.CurrentField ) <> глобальная переменная Then

значит поле поменялось и надо чего-то делать

End If
End Sub


<!--QuoteBegin-Lexa-xa+12:07:2006, 15:06 -->
<span class="vbquote">(Lexa-xa @ 12:07:2006, 15:06 )</span><!--QuoteEBegin-->А можно сделать такую штуку (другой вариант это задачи).
Тоже через промежуток времени (чтоб не проверять, редактировались поля или нет) вывести Сообщение, на подобе MsgBox(), которое закрывалось бы САМО, если пользователь не реагирует на него, т.е. допустим пользователь отошел, а тут бац и сообщение (ну например на 10 секунд) и через это время сообщение убирается и дальше идет обработка по моему усмотрению (скорее всего закрытие документа или что-нить еще).
[snapback]40013" rel="nofollow" target="_blank[/snapback]​
[/quote]

Такое сообщение (если не использовать API) наверное можно сделать тока через DialogBox используя в нем форму с таймером на автозакрытие. Сам не пробовал такое... :)
 
L

Lexa-xa

Это не проблема:
Sub Entering(Source As Field)
глобальная переменная = uidoc.FieldGetText( uidoc.CurrentField )
End Sub

Sub Exiting(Source As Field)
If uidoc.FieldGetText( uidoc.CurrentField ) <> глобальная переменная Then

значит поле поменялось и надо чего-то делать

End If
End Sub

Если прописывать в каждом поле, то умереть можно :unsure:

Такое сообщение (если не использовать API) наверное можно сделать тока через DialogBox используя в нем форму с таймером на автозакрытие. Сам не пробовал такое... :D

Да, я уже тоже подумываю об этом.

....... жаль, что-то DialogBox молчит, чтоб её ... Походу надо искать другое решение.
Благодарю за помощь.
 
A

Axel

<!--QuoteBegin-Lexa-xa+13:07:2006, 09:47 -->
<span class="vbquote">(Lexa-xa @ 13:07:2006, 09:47 )</span><!--QuoteEBegin-->Если прописывать в каждом поле, то умереть можно
[snapback]40057" rel="nofollow" target="_blank[/snapback]​
[/quote]

Это верно. Но если надо контролировать только несколько ключевых полей то проходит и такой вариант. Если же полей нужных много, тогда конечно тяжко.

И все-таки я не думаю что слишком долго будет отрабатывать построение хэша по сборке всех полей.....


<!--QuoteBegin-Lexa-xa+13:07:2006, 09:47 -->
<span class="vbquote">(Lexa-xa @ 13:07:2006, 09:47 )</span><!--QuoteEBegin-->Да, я уже тоже подумываю об этом.

....... жаль, что-то DialogBox молчит, чтоб её ... Походу надо искать другое решение.
[snapback]40057" rel="nofollow" target="_blank[/snapback]​
[/quote]

Мдааа.... и тут засада. При DialogBox-е таймер не отрабатывет :unsure:
Поищи все-таки API функцию для закрытия окна и тогда можно будет закрыть этот DialogBox из родительского по таймеру (если конечно DialogBox не глушит таймеры вообще)....
 
L

Lexa-xa

Поищи все-таки API функцию для закрытия окна и тогда можно будет закрыть этот DialogBox из родительского по таймеру (если конечно DialogBox не глушит таймеры вообще)....

Да я уже искал, нашел, попробовал, один .... не получится. :unsure:
Пишу
Код:
	Dim wHandle As Long
wHandle = 0
Call NEMMessageBox(0, "Message to display", "Title of Message box", 19)
Call NEMStopSubprogramWindow(wHandle) 'Закрываем текущее окно
а окно ноль эмоций, как висело, так и весит. Все-равно оно ждет реакции......
 
A

Axel

Для: Constantin A Chervonenko
Так таймер то на формочке которое в модальном окне.....
Потому вообще-то не очень понятно почему таймер не работает (вернее на мой взгляд он должен бы, но не работает......)


Для: Lexa-xa
Да, неприятно.
А не прокатит просто открыть новое окно документа. В смысде немодальное?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!