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

Сообщений: 34580
Дата регистрации: 28.05.2002
Да, при работе напрямую с таблицей ничего хорошего не получится - будет сохранятся запись целиком - все поля, даже те что и не меняли. Корявый режим
Не сохраняет "во второй форме" именно потому что видит конфликт. С lForce=.T. сохранит, переписав ВСЕ поля.
Работай с куросрадаптером, там всё работает как я описывал, более контролируемо...


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

Сообщений: 514
Дата регистрации: 03.12.2004
И таки ДА, действительно работает

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

Сообщений: 514
Дата регистрации: 03.12.2004
А сохранение только измененных полей возможно только через CursorAdapter или и через LocalViews, или его поведение такое ж самое, как и при редактировании таблицы напрямую?
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Нет, "напрямую" похоже он все поля пытается записать - большая часть возможностей не работает... Не работаю я "напрямую" с dbf-ами. Плохой это подход получается, слабо управляемый.
Главное - чтобы в таблице был первичный ключ (уникальное поле или на худой конец комбинация полей). Ну и корректно настраивать CAD а потом корректно писать код... Например, вполне логично после сохранения или "отмены" сделать перезапрос. При закрытии формы - либо автоматом пытаться вызвать сохранение, либо вопрос задать. Плюс само сохранение я предпочитаю делать "построчно" - вручную крутить цикл по изменённым записям (GETNEXTMODIFIED() позволяет их последовательно перебирать) и сохранять по одной - контролируя ошибки более "тонко" нежели если tableupdate сам будет цикл такой внутри себя крутить... Плюс транзакции - если нужно обеспечить согласованность сохранения/несохранения разных записей. В общем ещё куча нюансов есть которые нужно продумывать чтобы получился красивый и правильный код


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

Сообщений: 514
Дата регистрации: 03.12.2004
Сколько книжек по VFP перечитал, нигде такого не встречал (как Вы советуете), тому то и на буферизацию не подсел, а изобрел велосипед в виде авто генерации переменных, и редактирования их в форме..., но трудоемко это очень...

Покрутил я ваш пример, и очень мне понравилась сама идея управление записями, большое вам спасибо...
Вот только б где больше информации о CursorAdapter найти



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

Сообщений: 34580
Дата регистрации: 28.05.2002
В хелпе, и поиском по форуму.


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

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
В общем ещё куча нюансов есть которые нужно продумывать чтобы получился красивый и правильный код

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

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

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.
Т.е. не только "чужих программ", она ещё и блокировок соседних сессий не видит
Это нужно лишь для "системного" кода - когда ты пишешь свои "универсальные" функции/классы/каркас приложения и не можешь гарантировать чего там в конкретной "прикладной" форме потом ты сам или другой разработчик напишет. А твой код должен знать заблокирована запись или нет...

Но.. вот мой код... работает правильно, надеюсь, по доступу к записи таблицы?
IF RLOCK() && заблокировать запись таблицы, если она не заблокирована другим сетевым пользователем
* что-то экслюзивно делаю с записью
UNLOCK
ENDIF

И ты думаешь, что ISRLOCK() не покажет факт RLOCK() другого сетевого пользователя? (я правда ISRLOCK не использовал ни разу...)
Ratings: 0 negative/0 positive
Re: Как узнать что другой пользователь открыл для редактировать запись в буферизированой таблице
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
Но.. вот мой код... работает правильно, надеюсь, по доступу к записи таблицы?
Да, хотя и имеет смысл в ОЧЕНЬ редких случаях. Как правило хватает автоматической блокировки, настройки SET REPROCESS и обработки ошибок.
of63
И ты думаешь, что ISRLOCK() не покажет факт RLOCK() другого сетевого пользователя?
Я ничего не "думаю". Это чётко написано в мануале - не покажет


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

Сообщений: 4217
Откуда: Москва
Дата регистрации: 11.11.2008
of63
И ты думаешь, что ISRLOCK() не покажет факт RLOCK() другого сетевого пользователя? (я правда ISRLOCK не использовал ни разу...)
Запускаешь Фокс.
Открываешь таблицу в режиме SHARED
? LOCK() && .T.
? ISRLOCK() && .T.

Запускаешь второй экземпляр Фокса.
Открываешь ту же таблицу в режиме SHARED
? ISRLOCK() && .F. - не знает, что 1-й экземпляр заблокировал запись
? LOCK() && .F. - не может заблокировать заблокированную 1-м экземпляром запись



Исправлено 2 раз(а). Последнее : akvvohinc, 18.03.17 17:43
Ratings: 0 negative/0 positive


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

On-line: 24 (Гостей: 24)

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