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

Тема в разделе "Lotus - Программирование", создана пользователем Lexa-xa, 10 июл 2006.

  1. Lexa-xa

    Lexa-xa Гость

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

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

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

    Axel Гость

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Есть класс NotesTimer. Посмотри в хелпе пример.
     
  4. Lexa-xa

    Lexa-xa Гость

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

    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. Находишь самое большое время и отсчитываешь от текущего времени собственно сколько времени назад был изменен док. Если этот промежуток больше чем установлено, то сохраняешь и закрываешь док. :(
     
  6. Lexa-xa

    Lexa-xa Гость

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

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

    Axel Гость

    Для: Lexa-xa

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

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

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

    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 секунд) и через это время сообщение убирается и дальше идет обработка по моему усмотрению (скорее всего закрытие документа или что-нить еще).
     
  9. Axel

    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 используя в нем форму с таймером на автозакрытие. Сам не пробовал такое... :)
     
  10. Lexa-xa

    Lexa-xa Гость

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

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

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

    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 не глушит таймеры вообще)....
     
  12. Lexa-xa

    Lexa-xa Гость

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

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    DialogBox открывает модальное окно. Оные по определению останавливают все прочие процессы
     
  14. Axel

    Axel Гость

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


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

Поделиться этой страницей