Изменение значений в бекэнде

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 15 июн 2011.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Вот задался вопросом.. нужно проследить изменение документа в бекэнде.
    Ситуация такая:
    Пользователь 1 открывает документ... держит его какое-то время t.
    За это время t другой 2 пользователь открывает этот же документ.. правит его... и сохраняет.
    Далее пользователь 1 решает что-то сделать с документом (точнее нажать на кнопку в документе).
    При нажатии надо проверить были ли изменения документа за время t.
    Пытаюсь сделать так...
    По UNID открытого документа ищу в базе документ и сравниваю определенные поля.
    Но вот не задача... таким способом получаю текущий открытый документ без изменений :gigi:
    Как бы это обойти? или может я что-то не так делаю?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    NickProstoNick
    возможнос закрыть документ 1

    взять его по униду заново ( "скинув" перед этим сессию и базу )
    и открыть уже с новыми значениями
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Закрыть - не вариант. Документ мог и не измениться.
     
  4. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Основное условие, иначе новый объекта документа не создается.


    Добавлено: вообще обычно достаточно "delete doc"
     
  5. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    NickProstoNick
    пробуйте просто , как написал ув.kizarek Delete сессия\база\док

    ещё как вариант
    зделать вьюшку с ключевыми полями , с категорией УНИД
    с АвтоАпдейтом = 1(тру)
    и делать ГетВьюЕнтриБайКей по Униду

    у найденного энтриса проверять значение колонки
    .. но это совсем изврат

    Добавлено: NickProstoNick
    а к чему такая необходимость чтобы одновременно можно было править один документ?
     
  6. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Так исторически сложилось :gigi:
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Мб, стоит сделать кнопку Обновить, переоткрывающую док?
    хорошая отмазка, только иногда стоит решаться и менять историю - вынести поля для правки в отдельные доки-респонсы и т.п.
    а то иногда потом такой головняк может вылазить(
    Можно сделать на кнопку запуск агента, который считает док заново по ид или из вьюхи.
     
  8. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Действительно помогло! спасибо!

    Добавлено:
    Так тоже работает :gigi:

    Добавлено:
    Не вариант. Чем больше кнопок - тем больше путается юзер. Это же надо помнить и думать что над документом могут работать несколько человек.

    Была бы возможность - может и поменял бы.

    А про агент я как-то не подумал... спасибо
    Но с агентом тоже не вариант... без документа-посредника результат не вернешь в основной код. Все тот же головняк.
     
  9. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Понимаю, что "так исторически сложилось", но подход идеологически неверен, т.к. определить кто и что менял очень трудоёмко.. поэтому часто эту задачу бросают, что для контроля и разбора полётов по важным докам неприемлемо; для доков, типа справочников, это не существенно, чтобы им заморачиваться.

    Добавил: у меня всё сведено к бэкэндным изменениям.. в коде беру последнюю дату модификации из текущего дока, потом получаю док заново и сравниваю, если она не совпадает, то заменяю текущий док тем, что получил для проверки даты, ну т.д...
     
  10. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    Как вариант к предложеному Morpheus: в виде в колонке не ключевые поля а дата\время изменеия (@Modified), при открытии сохраняем в глобалах текущее время изменения, потом сравниваем со значением из вьюшки - другое значит док правился и его надо переоткрыть.

    Для тех кому не понятно для чего может пригодится: проблема в том что если я открыл на чтение док-т, он у меня повисел в режиме просмотра, а в это время другой юзер правил его и сохранил. Если я после этого нажму правка, то Лотус не перечитывает его с базы, а использует то что было получено для отображения в режиме просмотра - получаем "граблями в лоб"... :(
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Совершенно верно! Поэтому я когда-то предлагал Handling of conflict situations (UI), но тупизм, видимо, победил...
     
  12. Darker

    Darker Гость

    я так понимаю, что сие проверяется перед сохранением?
     
  13. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Можно перед сохранением, но тогда только запросная система проканает.
    Я беру док и проверяю перед началом внесением изменений, тогда же провожу попытку блокировки, так что всё тип-топ.
     
  14. Darker

    Darker Гость

    VladSh
    как быть если одновременно отрабатывают несколько агентов, затрагивающих одновременно один документ.
    Предположим первый агент работает с документом n секунд, второй n*k. Получается одному из них придется обработать документ заново? Либо один из агентов блокирует документ, остальные ожидают?
     
Загрузка...

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