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

NickProstoNick

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

morpheus

скриптописец
07.08.2006
3 915
1
#2
NickProstoNick
возможнос закрыть документ 1

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

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#3
NickProstoNick
возможнос закрыть документ 1

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

morpheus

скриптописец
07.08.2006
3 915
1
#5
NickProstoNick
пробуйте просто , как написал ув.kizarek Delete сессия\база\док

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

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

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

hosm

* so what *
18.05.2009
2 442
6
#7
Закрыть - не вариант. Документ мог и не измениться.
Мб, стоит сделать кнопку Обновить, переоткрывающую док?
хорошая отмазка, только иногда стоит решаться и менять историю - вынести поля для правки в отдельные доки-респонсы и т.п.
а то иногда потом такой головняк может вылазить(
Можно сделать на кнопку запуск агента, который считает док заново по ид или из вьюхи.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#8
Добавлено: вообще обычно достаточно "delete doc"
Действительно помогло! спасибо!

Добавлено:
NickProstoNick
пробуйте просто , как написал ув.kizarek Delete сессия\база\док

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

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

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

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

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

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#9
Пользователь 1 открывает документ... держит его какое-то время t.
За это время t другой 2 пользователь открывает этот же документ.. правит его... и сохраняет.
Понимаю, что "так исторически сложилось", но подход идеологически неверен, т.к. определить кто и что менял очень трудоёмко.. поэтому часто эту задачу бросают, что для контроля и разбора полётов по важным докам неприемлемо; для доков, типа справочников, это не существенно, чтобы им заморачиваться.

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

duchan

Well-known member
20.09.2006
110
3
#10
Как вариант к предложеному Morpheus: в виде в колонке не ключевые поля а дата\время изменеия (@Modified), при открытии сохраняем в глобалах текущее время изменения, потом сравниваем со значением из вьюшки - другое значит док правился и его надо переоткрыть.

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

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#11
Для тех кому не понятно для чего может пригодится: проблема в том что если я открыл на чтение док-т, он у меня повисел в режиме просмотра, а в это время другой юзер правил его и сохранил. Если я после этого нажму правка, то Лотус не перечитывает его с базы, а использует то что было получено для отображения в режиме просмотра - получаем "граблями в лоб"... :(
Совершенно верно! Поэтому я когда-то предлагал Handling of conflict situations (UI), но тупизм, видимо, победил...
 
D

Darker

#12
в коде беру последнюю дату модификации из текущего дока, потом получаю док заново и сравниваю, если она не совпадает, то заменяю текущий док тем, что получил для проверки даты, ну т.д...
я так понимаю, что сие проверяется перед сохранением?
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#13
я так понимаю, что сие проверяется перед сохранением?
Можно перед сохранением, но тогда только запросная система проканает.
Я беру док и проверяю перед началом внесением изменений, тогда же провожу попытку блокировки, так что всё тип-топ.
 
D

Darker

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