:: Visual Foxpro, Foxpro for DOS
Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
На жаль, я с темой БУФЕРИЗАЦИИ вообще не знаком, пишу в стиле FoxPro2, то есть перед редактированием загоняю запись в переменные, там их редактирую, и потом сохраняю.
Все это работает, но это очень трудоемко...
Решил все таки разобраться с буферизацией, и вот первый вопрос

Устанавливается пессимистическая буферизация для записей
=CURSORSETPROP("Buffering", 2, "table1")

Пользователь открывает запись на редактирование, при чем изменения там может и не делать.
Как другому пользователю запретить редактирование этой записи?

Использовать команду LOCK()?

PS.Вопрос в том, как узнать что запись редактируется, без блокировки записи командой LOCK?



Исправлено 1 раз(а). Последнее : ZenTigra, 10.03.17 18:54
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ISRLOCKED() ?
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
of63
ISRLOCKED() ?
Нет, эта ф-ия возвращает только статус блокировки у текущего клиента.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не надо использовать режим буферизации 2 (и соответственно 4).
Не надо "блокировать" запись при начале её редактирования (ни вручную, ни автоматически при 2/4 режимах буферизации).
Не надо определять кто заблокировал запись, и заблокировал ли вообще (это можно определить только самому заблокировав данную запись).

Имеет смысл на уровне самих данных минимизировать "пересечения" - чтобы разные пользователи правили по возможности разные записи (особенно это касается справочной информации - когда "ответственных" более одного, виноватого никак не найти).
Нужно понять как работает "оптимистическая" буферизация, как определяются конфликты совместного изменения, как они разрешаются, и когда вообще нужно на это заморачиваться (т.к. пользователи всегда "тупые", и им нас*** на то что кто-то там чего-то наисправлял, они практически всегда будут свои изменения ставить превыше чужих - т.е. переписывать всё что смогут "своими" данными - не смогут в данную секунду - подождут и изменят через пару минут).

of63
ISRLOCKED() ?
Показывает заблокировали ли МЫ запись (для склеротиков которые не помнят чего сами чуть ранее делали ну или для случаев автоматических блокировок). Про "других" не сообщит, т.к. не должна.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Igor Korolyov
Не надо использовать режим буферизации 2 (и соответственно 4).
Не надо "блокировать" запись при начале её редактирования (ни вручную, ни автоматически при 2/4 режимах буферизации).
Не надо определять кто заблокировал запись, и заблокировал ли вообще (это можно определить только самому заблокировав данную запись).

Имеет смысл на уровне самих данных минимизировать "пересечения" - чтобы разные пользователи правили по возможности разные записи (особенно это касается справочной информации - когда "ответственных" более одного, виноватого никак не найти).
Нужно понять как работает "оптимистическая" буферизация, как определяются конфликты совместного изменения, как они разрешаются, и когда вообще нужно на это заморачиваться (т.к. пользователи всегда "тупые", и им нас*** на то что кто-то там чего-то наисправлял, они практически всегда будут свои изменения ставить превыше чужих - т.е. переписывать всё что смогут "своими" данными - не смогут в данную секунду - подождут и изменят через пару минут).

of63
ISRLOCKED() ?
Показывает заблокировали ли МЫ запись (для склеротиков которые не помнят чего сами чуть ранее делали ну или для случаев автоматических блокировок). Про "других" не сообщит, т.к. не должна.

Я понимаю, что все что вы написали правильно, но в моем случае, эти записи не часто редактируют, и мучиться разруливая конфликты совместного изменения я не хочу... лень...
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
вряд ли так тупо сделана ISRLOCKED в фоксе... возьми, ТС, да попробуй, и нам расскажешь )
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
(скорее всего это "симметьричные" ф-ии локирования части байтов в файле, писать об этом нет смысла)
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
Igor Korolyov

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

Обычно их и не "разруливают" (только для особо ответственных данных и ответственных пользователей это имеет смысл) - тупо пишут поверх. "Кто последний тот и прав". lForce = .T.
В 5 режиме буферизации, БЕЗ блокировки "в момент начала редактирования" - только в момент записи уже завершённых в полях формы изменений.

Это просто. Гораздо проще горы глупого кода для отслеживания чужих блокировок... Ну и не менее глупого последующего хождения по пользователям с просьбой "отдай запись, изверг, потом свой кофе допьёшь".

of63
вряд ли так тупо сделана ISRLOCKED в фоксе
Она сделана не тупо, она сделана для других целей.

мануал
ISRLOCKED( ) returns a logical true (.T.) if the record is locked by the current application; otherwise a logical false (.F.) is returned.
Note
ISRLOCKED( ) only returns .T. in the data session that applied the record lock.
Т.е. не только "чужих программ", она ещё и блокировок соседних сессий не видит
Это нужно лишь для "системного" кода - когда ты пишешь свои "универсальные" функции/классы/каркас приложения и не можешь гарантировать чего там в конкретной "прикладной" форме потом ты сам или другой разработчик напишет. А твой код должен знать заблокирована запись или нет...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Нет, в моем случае это ОЧЕНЬ важные данные, и не все пользователи могут эти данные редактировать, а только пользователи с правами системных администраторов, тому в этом случае, я лучше на LOCK() посижу....
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Блокировка записи в момент начала редактирования, или, тем более, в момент просто "начала смотрения" на эту запись не имеет АБСОЛЮТНО никакого отношения к разграничению прав и к тому что только "большой человек" имеет право данную запись править. Более того, чем уже круг "допущенных" тем меньше нужно парится по поводу того что два или более таких вот привелигированных пользователей одновременно захотят править одну и ту же запись.
Хозяин-барин, конечно, но я бы сказал что это (блокировка записи "заранее", плюс ещё и глупый вопрос "как узнать заблокирована ли запись кем-то") попросту ненужная фигня


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Igor Korolyov
Блокировка записи в момент начала редактирования, или, тем более, в момент просто "начала смотрения" на эту запись не имеет АБСОЛЮТНО никакого отношения к разграничению прав и к тому что только "большой человек" имеет право данную запись править. Более того, чем уже круг "допущенных" тем меньше нужно парится по поводу того что два или более таких вот привелигированных пользователей одновременно захотят править одну и ту же запись.
Хозяин-барин, конечно, но я бы сказал что это (блокировка записи "заранее", плюс ещё и глупый вопрос "как узнать заблокирована ли запись кем-то") попросту ненужная фигня

Меня восхищает ваше упорство научить дурака правильно писать программу, на жаль, сейчас у меня под рукой нету компьютера с VFP чтоб проверить вашу правоту, посему у меня к Вам вопрос, команда =TABLEUPDATE(.T.) - изменяет ВСЕ записи в столбцах редактируемой таблицы, или только те, где были произведены изменения?

Например, есть таблица, там есть три поля поле1, поле2, поле3

Первый пользователь начал редактировать запись и внес изменения в поле2 (остальные поля не трогает)(и не сохранил запись), в этот момент второй пользователь изменил поле3, и сделал сохранения. Вопрос, при сохранении записи первым пользователем поле3 перезапишется?
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Добрался до компьютера, создал тестовую форму, попробовал, и что-то ничего у меня не вышло
Во первых WhereType - кажись только для курсора, а не для таблицы (Property is invalid for table cursors/Свойство недействительно для таблицы),
или подскажите правильный синтаксис этой команды.
А с курсорами я пока не хочу работать, мне сначала нужно разобраться с Буферизацией таблиц.

Так вот, VFP не хочет вообще сохранять данные для первого пользователя

=CURSORSETPROP("Buffering", 5, "Table1")

Ошибки нету, но не сохраняет
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
ZenTigra
Так вот, VFP не хочет вообще сохранять данные для первого пользователя

Так надо примером кинуться сюда, наверняка что-то неправильно сделано.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Та какой там пример, простенький код для теста

SELECT 0
USE D:\Test\table1.dbf AGAIN
=CURSORSETPROP("Buffering", 5, "table1")
DO FORM D:\Test\form_bufer
SELECT 0
USE D:\Test\table1.dbf AGAIN ALIAS table2
=CURSORSETPROP("Buffering", 5, "table2")
DO FORM D:\Test\form_bufer2

Формы идентичные, на них размещено три поля, ControlSource = table1.key, ...=table1.name, ...=table1.suma
и четыре кнопки
SKIP -1/ SKIP +1
Select table1
=TABLEUPDATE(0)
Select table1
=TABLEREVERT(0)

И такие ж для второй формы...

и все, это для теста..., посмотреть работу двух пользователей одновременно

Сохраняешь, смотришь эти две таблицы через browse записи не идентичные, то есть в первой сохраненные записи 1 пользователя, у второй второго,
закрываешь таблицы, и все, записи второго пользователя не сохранены (или первого, в зависимости от того кто первый нажал кнопку Save) ...

При
=CURSORSETPROP("Buffering", 2, "table1")
- выдает ошибку изменения


Исправлено 3 раз(а). Последнее : ZenTigra, 11.03.17 18:45
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
ZenTigra
И такие ж для второй формы...

Если есть тестовая форма - ее тоже лучше кинуть. И таблицу/курсор программно создать. Короче, полный репро-код, который можно запустить.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
sphinx
ZenTigra
И такие ж для второй формы...

Если есть тестовая форма - ее тоже лучше кинуть. И таблицу/курсор программно создать. Короче, полный репро-код, который можно запустить.


А как? Архивированный проект занимает всего лишь 7Kb, но я его не умею вставить в сообщение...
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Когда пишешь сообщение, есть строка (выше расположена) Присоединить файл

Надо щелкнуть левой кнопкой мыши по этой строке и указать файл. Файл прикрепится к сообщению - вот и всё.



Исправлено 1 раз(а). Последнее : Simple777, 11.03.17 21:07
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Содержимое архива сохраняете на диск c:\
запуск через program1.prg

Запускается две формы, в Form1 измените поле name, а в Form2 suma,
и поочередно сохраните, потом Просмотр

Это одна и та же таблица, но данные сохраняются только той формы где первым нажата кнопка сохранить
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Вот скриншот...


Дело не в коде, а в моем незнании буферизации, хочу научиться, помогите



Исправлено 1 раз(а). Последнее : ZenTigra, 11.03.17 21:23
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 53 Rifat  (Гостей: 52)

© 2000-2024 Fox Club 
Яндекс.Метрика