Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
На жаль, я с темой БУФЕРИЗАЦИИ вообще не знаком, пишу в стиле FoxPro2, то есть перед редактированием загоняю запись в переменные, там их редактирую, и потом сохраняю.
Все это работает, но это очень трудоемко... Решил все таки разобраться с буферизацией, и вот первый вопрос Устанавливается пессимистическая буферизация для записей =CURSORSETPROP("Buffering", 2, "table1") Пользователь открывает запись на редактирование, при чем изменения там может и не делать. Как другому пользователю запретить редактирование этой записи? Использовать команду LOCK()? PS.Вопрос в том, как узнать что запись редактируется, без блокировки записи командой LOCK? Исправлено 1 раз(а). Последнее : ZenTigra, 10.03.17 18:54 |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
ISRLOCKED() ?
|
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
PaulWist Сообщений: 14601 Дата регистрации: 01.04.2004 |
Нет, эта ф-ия возвращает только статус блокировки у текущего клиента. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не надо использовать режим буферизации 2 (и соответственно 4).
Не надо "блокировать" запись при начале её редактирования (ни вручную, ни автоматически при 2/4 режимах буферизации). Не надо определять кто заблокировал запись, и заблокировал ли вообще (это можно определить только самому заблокировав данную запись). Имеет смысл на уровне самих данных минимизировать "пересечения" - чтобы разные пользователи правили по возможности разные записи (особенно это касается справочной информации - когда "ответственных" более одного, виноватого никак не найти). Нужно понять как работает "оптимистическая" буферизация, как определяются конфликты совместного изменения, как они разрешаются, и когда вообще нужно на это заморачиваться (т.к. пользователи всегда "тупые", и им нас*** на то что кто-то там чего-то наисправлял, они практически всегда будут свои изменения ставить превыше чужих - т.е. переписывать всё что смогут "своими" данными - не смогут в данную секунду - подождут и изменят через пару минут). Показывает заблокировали ли МЫ запись (для склеротиков которые не помнят чего сами чуть ранее делали ну или для случаев автоматических блокировок). Про "других" не сообщит, т.к. не должна. ------------------ WBR, Igor |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Я понимаю, что все что вы написали правильно, но в моем случае, эти записи не часто редактируют, и мучиться разруливая конфликты совместного изменения я не хочу... лень... |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
вряд ли так тупо сделана ISRLOCKED в фоксе... возьми, ТС, да попробуй, и нам расскажешь )
|
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
(скорее всего это "симметьричные" ф-ии локирования части байтов в файле, писать об этом нет смысла)
|
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Обычно их и не "разруливают" (только для особо ответственных данных и ответственных пользователей это имеет смысл) - тупо пишут поверх. "Кто последний тот и прав". lForce = .T. В 5 режиме буферизации, БЕЗ блокировки "в момент начала редактирования" - только в момент записи уже завершённых в полях формы изменений. Это просто. Гораздо проще горы глупого кода для отслеживания чужих блокировок... Ну и не менее глупого последующего хождения по пользователям с просьбой "отдай запись, изверг, потом свой кофе допьёшь". Она сделана не тупо, она сделана для других целей. Т.е. не только "чужих программ", она ещё и блокировок соседних сессий не видит Это нужно лишь для "системного" кода - когда ты пишешь свои "универсальные" функции/классы/каркас приложения и не можешь гарантировать чего там в конкретной "прикладной" форме потом ты сам или другой разработчик напишет. А твой код должен знать заблокирована запись или нет... ------------------ WBR, Igor |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Нет, в моем случае это ОЧЕНЬ важные данные, и не все пользователи могут эти данные редактировать, а только пользователи с правами системных администраторов, тому в этом случае, я лучше на LOCK() посижу....
|
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Блокировка записи в момент начала редактирования, или, тем более, в момент просто "начала смотрения" на эту запись не имеет АБСОЛЮТНО никакого отношения к разграничению прав и к тому что только "большой человек" имеет право данную запись править. Более того, чем уже круг "допущенных" тем меньше нужно парится по поводу того что два или более таких вот привелигированных пользователей одновременно захотят править одну и ту же запись.
Хозяин-барин, конечно, но я бы сказал что это (блокировка записи "заранее", плюс ещё и глупый вопрос "как узнать заблокирована ли запись кем-то") попросту ненужная фигня ------------------ WBR, Igor |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Меня восхищает ваше упорство научить дурака правильно писать программу, на жаль, сейчас у меня под рукой нету компьютера с VFP чтоб проверить вашу правоту, посему у меня к Вам вопрос, команда =TABLEUPDATE(.T.) - изменяет ВСЕ записи в столбцах редактируемой таблицы, или только те, где были произведены изменения? Например, есть таблица, там есть три поля поле1, поле2, поле3 Первый пользователь начал редактировать запись и внес изменения в поле2 (остальные поля не трогает)(и не сохранил запись), в этот момент второй пользователь изменил поле3, и сделал сохранения. Вопрос, при сохранении записи первым пользователем поле3 перезапишется? |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Нет, не перезапишется.
НО в зависимости от настроек WhereType у первого (позже сохраняющего) пользователя tableupdate(0, .f.) может вернуть .F. и вообще ничего не сохранить. AERROR скажет что был Update Conflict. Это настройка не по умолчанию WhereType=2 - KeyAndUpdatableFields. Для настройки по умолчанию 3 - KeyAndModifiedFields при сохранении на "конфликт" будут проверяться только изменённые поля (в примере - поле2 для первого пользователя - и т.к. оно в таблице осталось неизменным, то сохранение сработает без ошибок, переписав только это самое поле2 в таблице). После выявления конфликта при помощи CURVAL("поле"), OLDVAL("поле") и собственно "курсор.поле" можно показать все 3 состояния - текущее в таблице, то что было в таблице на момент начала редактирования (именно тогда фокс и "фиксирует" текущее значение полей), и то что мы ввели (естественно можно запросить так инфу по любому полю и даже выражению - просто для тех которые вообще никто не трогал всё "совпадёт"). После чего можно уже полноценно разрешать конфликтную ситуацию. Хотя в 99% случаев после определения конфликта всё равно исполняется tableupdate(0, .T.) - что пропихивает наши изменения в таблицу (ещё раз - только ИЗМЕНЕНИЯ. Те поля которые в этой сессии не трогали, переписываться не будут). "Лентяи" просто всегда сразу применяют tableupdate(0, .T.) или же WhereType=1 - KeyFieldsOnly и "неудача" у них возникает лишь в случае если редактируемую запись за время её правки кто-то снаружи вообще удалил. Хотя я не помню точно, возможно что при работе "напрямую" с таблицей (не с представлением/адаптером) даже такая ситуация не вызовет ошибки - т.к. физически то запись никуда не делась ------------------ WBR, Igor |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Добрался до компьютера, создал тестовую форму, попробовал, и что-то ничего у меня не вышло
Во первых WhereType - кажись только для курсора, а не для таблицы (Property is invalid for table cursors/Свойство недействительно для таблицы), или подскажите правильный синтаксис этой команды. А с курсорами я пока не хочу работать, мне сначала нужно разобраться с Буферизацией таблиц. Так вот, VFP не хочет вообще сохранять данные для первого пользователя =CURSORSETPROP("Buffering", 5, "Table1") Ошибки нету, но не сохраняет |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
sphinx Сообщений: 31166 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Так надо примером кинуться сюда, наверняка что-то неправильно сделано. ------------------ "Veni, vidi, vici!"(с) |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Та какой там пример, простенький код для теста
Формы идентичные, на них размещено три поля, ControlSource = table1.key, ...=table1.name, ...=table1.suma и четыре кнопки
И такие ж для второй формы... и все, это для теста..., посмотреть работу двух пользователей одновременно Сохраняешь, смотришь эти две таблицы через browse записи не идентичные, то есть в первой сохраненные записи 1 пользователя, у второй второго, закрываешь таблицы, и все, записи второго пользователя не сохранены (или первого, в зависимости от того кто первый нажал кнопку Save) ... При
Исправлено 3 раз(а). Последнее : ZenTigra, 11.03.17 18:45 |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
sphinx Сообщений: 31166 Откуда: Каменск-Уральски Дата регистрации: 22.11.2006 |
Если есть тестовая форма - ее тоже лучше кинуть. И таблицу/курсор программно создать. Короче, полный репро-код, который можно запустить. ------------------ "Veni, vidi, vici!"(с) |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
А как? Архивированный проект занимает всего лишь 7Kb, но я его не умею вставить в сообщение... |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Когда пишешь сообщение, есть строка (выше расположена) Присоединить файл
Надо щелкнуть левой кнопкой мыши по этой строке и указать файл. Файл прикрепится к сообщению - вот и всё. Исправлено 1 раз(а). Последнее : Simple777, 11.03.17 21:07 |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Содержимое архива сохраняете на диск c:\
запуск через program1.prg Запускается две формы, в Form1 измените поле name, а в Form2 suma, и поочередно сохраните, потом Просмотр Это одна и та же таблица, но данные сохраняются только той формы где первым нажата кнопка сохранить |
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Вот скриншот...
Дело не в коде, а в моем незнании буферизации, хочу научиться, помогите Исправлено 1 раз(а). Последнее : ZenTigra, 11.03.17 21:23 |
© 2000-2024 Fox Club  |