Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Есть база данных на сервере, содержащая несколько таблиц. На клиенте открывается одна таблица, используется удаленное представление. Свойства уд.пред-я: UpdateType=1,SendUpdates=TRUE,SourceType=2,для всех полей Updatable=TRUE Редактирование данных происходит на форме. Буферизация=3(или 5). Перед редактированием записи блокирую ее LOCK(). В этоже время на другой машине делаю тоже самое (т.е. вхожу в режим редактирования той же записи) - никаких сообщений что запись блокирована другим пользователем или что-то подобное. Данные спокойно записываются по TABLEUPDATE(.T.,.T.). В статье Работа в локальной сети (http://]http://www.foxhelp.ru/RabotaVLokal'nojjSetiVFP6?v=6zi) написано: "Обновление происходит явно - командой TABLEUPDATE(), или неявно при перемещении указателя курсора на другую строку или закрытием таблицы. VFP сгенерирует ошибку, если при обновлении окажется, что другой пользователь уже успел изменить данные, пока вы их редактировали. Вы можете отказаться от обновления или принудительно записать изменения. Поэтому, вам нужно сообщать пользователю перед редактированием данных, что строка уже редактируется другим, или что обновление строки уже произведено другим пользователем." Перерыл весь форум, но так и непонял. Как определить редактируется в данный момент одна и таже запись разными юзерами, заблокирована она или нет. И как же это делается "сообщать пользователю перед редактированием данных, что строка уже редактируется другим, или что обновление строки уже произведено другим пользователем" . Может это делается не через удал.пред-е, или какие установки??? Поясните пожалуйста ход действий, если можно поподробнее!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 08:40 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Сообщение ВладимираМ Re: Блокировка в представлении Владимир Максимов Москва На форуме с: 02.09.2000 написано 21.01.05 10:05 Ответить:: -------------------------------------------------------------------------------- По сути View - это результат выполнения команды Select-SQL. Поэтому каждый пользователь имеет свою собственную выборку (копию данных). Как следствие, абсолютно бессмысленно пытаться блокировать записи во View. Нет. Это не запрещено. Просто с выборкой всегда работает только один пользователь. У другого пользователя - другая выборка. Как сделать чтобы другой user не мог изменить редактируемую запись. А не надо этого делать вообще! Твои View находятся в режиме оптимистической буферизации. Вот и надо "разруливать" конфликты совместного доступа в момент попытки сброса изменени И как это собственно "разруливать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 09:01 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Для этого и существует пессимистическая блокировка... То есть Вы можете явно заблокировать запись перед началом редактирования - а всем другим пользователям включить проверку перед началом редактирования на захват записи другим пользователем... Но такой способ пройдет только с данными VFP и без всяких удаленный представлений... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 09:17 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Вопрос повторяется с завидной регулярностью. Почитайте по ссылке http://www.sql.ru/forum/actualthread.aspx?tid=127239#1005175 Там речь идет о Remote View, но для Local View все абсолютно то же самое. Несколько тезисов: -) Не надо блокировать запись вручную -) О том, что запись изменена другим пользователем можно узнать при попытке сброса своих изменений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 10:31 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
ВладимируМ По вышеприведенной ссылке можно понять о том, что кто-то редактировал запись только после того, как выдаем TableUpdate, т.е. после редактирования этой записи и выдачи команды "Сохранить изменения". А как же быть насчет: "сообщать пользователю перед редактированием данных, что строка уже редактируется другим". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 11:31 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
RaufMА как же быть насчет: "сообщать пользователю перед редактированием данных, что строка уже редактируется другим". А зачем? Когда возникают подобные вопросы надо начинать не с того, чтобы сразу пытаться их решить, а с прямо противоположного: Что будет, если два пользователя "одновременно" редактируют одну и ту же запись? Ну, в самом процессе редактирования ничего плохого не будет. Они друг другу не мешают. Проблему будут в момент сброса изменений. А вот тут масса "тонких" моментов: -) Пользователи редактировали разные поля одной и той же записи - никаких проблем. Разрешаем модификацию без ограничений. -) Пользователи редактировали общие поля, но это были не "критичные" поля. Ну, например, они редактировали Фамилию клиента. Вряд ли имеет смысл что-то запрещать. Скорее, тоже можно разрешить модификацию без ограничений -) Пользователи редактировали общие "критичные" поля. Для начала, следует предупредить того, кто начал сброс позднее, что за время пока он редактировал кто-то другой уже вне сизменения и спросить писать ли поверх. Далее. Модификация таких "критичных" полей обычно собровождается кучей условий, который прописываются в триггерах. Т.е. вообще-то, это изменение может быть отклонено. В случае запрета на модификацию выдаем сообщение пользователю и он принимает решение: внести другие изменения, обновить данные или отказаться вообще от модификации данной записи. Следующий вопрос, который надо себе задать: А насколько вообще вероятна подобная ситуация? Как правило, пользователи не лезут в "чужие" данные. Им и так хватает работы. Разумеется, если это не обусловлено спецификой задачи. Т.е. в большинстве случаев, ситуация редактирования разными пользователями одной и той же записи маловероятна. И забивать себе голову сложными алгоритмами "разруливания" подобных ситуаций не имеет смысла. Либо просто писать поверх, либо полный откат и повторный ввод для второго пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 12:14 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
ВладимируМ Спасибо за ответ. В принципе пока можно работать по вашей схеме "Либо просто писать поверх, либо полный откат и повторный ввод для второго пользователя" Есть еще одна проблема, кажется это уже обсуждалось, но вразумительного ничего не нашел. Уж извините, если прошу повториться или дайте ссылку. После редактирований, удалений записей и добавления новых что-то не получается обновить данные на клиенте, т.е. хотелось бы видеть самые актуальные данные, что нужно сделать (применительно к вышеописанной задаче) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 12:30 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
RaufMПосле редактирований, удалений записей и добавления новых что-то не получается обновить данные на клиенте, т.е. хотелось бы видеть самые актуальные данные, что нужно сделать (применительно к вышеописанной задаче) Не совсем понял проблему. Если дается команда Requery("MyView"), то обновляется содержимое MyView полностью. Т.е. берутся актуальные данные, те, что сейчас реально в базе данных. В этот момент клиент и видит, что есть реально в базе данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 13:08 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
я так и делал Requery(...). Но срабатывает только со второго раза. Т.е., редактирую запись на одной машине, сохраняю, сообщается Requery(...)=1, в это время на другой машине - изменения не отражены, даю на ней Requery(...) - тогда появляются изменения, если не даю - ничего. Может быть где-то должно быть типа AutoRefresh или использовать SET REFRESH TO nSeconds, но это наверное будет сильно напрягать процессор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 14:06 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Ещё раз ВНИМАТЕЛЬНО прочти "большой" пост ВладимираМ, если уж так хочеться автоматом обновлять данные, то обычно используется таймер кот. перезапрашивает данные, но это не решение проблемы в случае редактирования одной записи, те давай считать, что пользователей работающих с одной записью не два, а N, тогда N-ый юзер никогда не внесет то что хочет, поскольку пока до него дойдет очередь, все предыдущие могут передумать и начать изменять снова и наш юзер только и будет смотреть как данные изменяются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 14:27 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
RaufMя так и делал Requery(...). Но срабатывает только со второго раза. Т.е., редактирую запись на одной машине, сохраняю, сообщается Requery(...)=1, в это время на другой машине - изменения не отражены, даю на ней Requery(...) - тогда появляются изменения, если не даю - ничего. Может быть где-то должно быть типа AutoRefresh или использовать SET REFRESH TO nSeconds, но это наверное будет сильно напрягать процессор? А ты еще обижаешся, почему часто посылают... читать HELP? View - это по сути результат выполнения команды Select-SQL. Т.е. это не исходные данные . Это выборка (некая копия) из исходных данных, которая существует только у одного клиента. Выполни на своей машине простой запрос по любой таблице вроде SELECT * FROM MyTable INTO CURSOR curTest NOFILTER А теперь измени содержимое этой самой таблицы MyTable. Тебя ведь не удивляет, что содержимое curTest никак не изменилось? Откуда тогда такое недоумение по поводу View? Чтобы изменилось содержимое curTest, надо выполнить этот запрос еще раз . Т.е., применительно к View, надо выполнить Requery() после изменения данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 14:44 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Так в том-то и дело, что Requery() даю после изменения данных и TABLEUPDATE(): ... TABLEUPDATE() Requery() ThisForm.Refreresh .... и ничего а когда ... TABLEUPDATE() Requery() ThisForm.Refreresh .... *потом еще раз Requery() .... тогда - есть В принципе дать два раза Requery() не проблема. Спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 15:43 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, не так написал. Requery() делать два раза нет толка , нужно на других машинах периодически обновлять представления! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2005, 15:49 |
|
||
|
Как узнать редактируется поле другим пользователем или нет?
|
|||
|---|---|---|---|
|
#18+
Hi RaufM! > Requery() делать два раза нет толка , нужно на других машинах > периодически обновлять представления! Для того чтобы получить свежие данные - да, но в общем случае этого не требуется (в смысле автоматом делать - добавь кнопку "обновить" и по её нажатию и обновляй выборку!). Ну оставил пользователь комп не закрыв прогу - пошёл обедать там или ещё что - а она постоянно запрашивает и запрашивает данные загружая сеть и сервер - ничего хорошего в этом нету! P.S. Порой после прочтения такой непростой темы надо подумать пару дней, поэкспериментировать, чтобы понять что же хотел сказать автор. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 14:10 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=335&tid=1594790]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 361ms |

| 0 / 0 |
