Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Привет всем! Надо сделать сетевое приложение. Поставить всякие там блокировки! Блокирую запись RLOCK(). Вопрос: В 1 экземпляре приложения, в котором запись блокируется, ISRLOCKED() отрабатывает нормально, а во 2 экземпляре оно говорит .F., а при попытке изменить выдается системное сообщение "Запись блокирована другим пользователем"! А хотелось бы свое!!! DataSession: Default, Buffermode: Pessimistic Record? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2004, 12:36 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Вот когда ISRLOCKED выдает .F. и надо выдать сообщение о невозможности блокирования и изменения и отказатся от дальнейших действий по изменению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2004, 17:55 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
В сетевом приложении команды ZAP, PACK, REINDEX считать матерными :-D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2004, 21:12 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
ISRLOCKED() - это вообще не для проверки блокировок другого пользователя!!! Rlock() и только... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2004, 04:04 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
BurnВот когда ISRLOCKED выдает .F. и надо выдать сообщение о невозможности блокирования и изменения и отказатся от дальнейших действий по изменению Я что неправильно порчитал??? 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. at the workstation that applied the record lock. by the current application - или только в текущем приложении??? А .F. она всегда возращает если и не блокирована!!! MaestroEv Rlock() и только... А вот это оно!!! Спасибо! Только надо кол-во попыток ограничивать! И как я сам не додумался!!! IF RLOCK() DO FORM addKlient WITH 2,RECNO("klient") ELSE MESSAGEBOX("Запись блокирована другим пользователем",64,"Сообщение") ENDIF Я все правильно осмыслил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 07:20 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Не, неправильно ;-) Потому что грубо это - блокировать все время, пока открыта форма на редактирование. Блокировать надо только на этапе записи изменений в таблицы. Правда, при этом геморроя с отслеживанием действий, возможно проведенных над записью параллельно другими пользователями, больше. А так - в предложенном коде не хватает unlock перед else. Ну а форма addKlient должна 1. работать с default datasession и 2. работать модально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 09:47 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Так точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 09:48 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Все еще хуже.... Как говорит мой учитель, а он многого достиг (он сейчас в Англии) - "Не нужно делать блокировок там где Fox и без вас знает, что ему делать..." То есть блокировать нужно только интерфейсные места, где можно явно наткнуться друг на друга и различные счетчики, а остальное Fox разрулит...наверное... А вот про блокировки интерфейса написано много... И как ни делай - все равно плохо... Нужно просто к этому привыкнуть... И приучить Юзверей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2004, 17:13 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
конечно приводить пример работы форм, созданных визардом я и сам считаю плохим тоном, но они-то как раз блокируют запись на время работы формы в режиме редактирования... может это и плохо (если юзер ушел покурить) но в другом случае, как отслеживать не поменял-ли кто другой данные пока я их меняю... геморр... хотя лично я в своих проджектах блокирую транзакцией на момент сброса данных в таблицы... естестеввно если нас 3-е редактировало - то тот кто последний сбросил - тот и прав.. плохо ну да что поделать.... лень... кстати явно через РЛОК я не делаю... приватная датасешн и на кнопке СОХРАНИТЬ навешена транзакция..... пока не завершена другой не сбросит... грубо согласен... при работе 5-6 юзеров не тестил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2004, 18:08 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
как отслеживать не поменял-ли кто другой данные пока я их меняю Существует такая вещь, как оптимистическая буферизация и второй параметр в команде TableUpdate() * Пользователь завершил редактирование в режиме оптимистической буферизации и нажал кнопку "Сохранить" IF TableUpdate(.F.,.F.)=.F. * Пока пользователь курил, другим пользователем были изменены те же данные. * Деламе дополнительный запрос пользователю и если он решил писать поверх TableUpdate(.F.,.T.) ENDIF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2004, 21:09 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Уважаемый ВладимирМ, поскольку мне как-то не приходилось пользоваться блокировкаси и тэйблипдейтом (ну не профи я...) нельзя ли десяток строчек кода в пример.... блокировку на форме ставлю оптимистическую.. а код под кнопкой сохранить приведите будьте добры... вкратце... где инсерт или апдэей в таблице, а где тэйблапдэйт.... Буду весьма признателен!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 09:02 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
блин столько опечаток... и НЕ блокировку а буфферизацию оптимистическую... сорри!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 09:03 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Если на таблицу установлен любой режим буферизации, то любые модификации производятся не сразу с таблицей, а записываются в некий "буфер". Т.е. ты выполняешь все обычные команды по модификации (INSERT-SQL, REPLACE, UPDATE-SQL), но они модифицируют не непосредственно исходную таблицу, а ее буфер. В режиме строковой буферизации (2 или 3) сброс буфера происходит: -) По команде TableUpdate() -) При переходе на другую запись -) При закрытии таблицы В режиме табличной буферизации (4 или 5) сброс буфера происходит -) Только по команде TableUpdate() и никак иначе Откат внесенных в буфер изменений и очистка буфера происходит по команде TableRevert() Это значит, что при установленном режиме буферизации ты работаешь с таблицами как обычно. Однако чтобы внесенные изменения попали в исходную таблицу необходимо сбросить буфер этой таблицы. Проверить факт модификации данных при табличной буферизации можно по команде GetNextModified(), а в пределах одной записи по GetFldState(). При работе в режиме табличной буферизации следует иметь в виду, что сброс буфера осуществляется по одной строке за раз. Это значит, что если в процессе сброса буфера произойдет ошибка, то хотя выполнение команды TableUpdate() будет прервано, но тем не менее все ранее сброшенные данные (сброшенные ДО возникновения ошибки) попадут в итоговую таблицу. Как следствие, если предполагается сброс более одной записи, то команду TableUpdate() следует окружать транзакцией. Если в процессе сброса буфера по команде TableUpdate() произошла ошибка, то никакого сообщения об ошибке не появится. Просто команда TableUpdate() вернет .F. Анализ причины ошибки следует выполнить при помощи функции AERROR(). Итого, примерный код кнопки "Сохранить" в режиме оптимистической табличной буферизации (5) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 10:46 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
ВладимирМ - Огромное спасибо!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 11:29 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Один авопрос!!! Датасессия на форме, в которой редактируется запись какая должна быть в Вашем примере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 11:32 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Датасессия на форме, в которой редактируется запись какая должна быть в Вашем примере? Без разницы. Private DataSession - это симуляция многопользовательского доступа для одного пользователя (с некоторыми ограничениями). Правда, я не проверял будет ли конфликт совместного доступа при одновременной правке в 2 формах одного приложения в Private DataSession. Но в одном приложении ты можешь организовать глобальный объект для отслеживания подобных ситуаций. Если правка будет осуществлятся только в модальных формах, то ввобще никаких вопросов не возникнет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 12:01 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
как раз имелось в виду, не редактирование в 2-3 одинаковых формах в пределах 1-го приложения.. а именно симуляция многопользовательской программы путем использования приватных сессий..... то есть явно команды use mytable in 5 shared вообще нет.. форма "сама" в приватной сессии открывает соответственно другой пользователь.. на другой машине тоже открывает ту же форму но из своего приложения... Ваш вариант при этом должен работать? Или все же лучше изменить подход и ЯВНО открывать таблицы??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 12:31 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
форма "сама" в приватной сессии открывает Это Вам так кажется. Реально выполняются те же команды USE. Просто их не надо явно прописывать в коде. Код написан из предположения, что данные правятся разными пользователями (или разными экземплярами программы на одном компьютере) Да, в коде, разумеется, вместо слова CONTINUE надо написать LOOP. Опечатка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2004, 14:52 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ Код: plaintext 1)Уважаемый Владимир, скажите а какие изменения произойдут в приведенном коде для пессимистической буферизации таблицы(4), а также на Ваш взгляд нужна ли кнопка "Сохранить" при буферизации записей (2,3)? 2)По Вашему мнению какую буферизацию лучше(надежнее) использовать, я так понимаю это зависит прежде всего от размера таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2004, 10:46 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
автор1)Уважаемый Владимир, скажите а какие изменения произойдут в приведенном коде для пессимистической буферизации таблицы(4), При пессимистической буферизации нет смысла во втором параметре в команде TableUpdate(). Т.е. ситуация, когда в процессе редактирования одним пользователем другой изменил те же самые записи в принципе невозможна. Следовательно, нет необходимости в цикле. автора также на Ваш взгляд нужна ли кнопка "Сохранить" при буферизации записей (2,3)? Зависит от того, как именно происходит редактирование - построчно (набор TextBox) или групами в Grid. Кроме того, следует уточнить постановку задачи. Возможно требуется автоматическое сохранение безо всяких кнопок. автор2)По Вашему мнению какую буферизацию лучше(надежнее) использовать, я так понимаю это зависит прежде всего от размера таблицы? Нет, это прежде всего зависит от постановки задачи. При пессимистической буферизации - проблемы в момент начала внесения изменений. Но нет вопросов по одновременному редактированию двумя пользователями. Это просто невозможно. Однако есть серьезный риск "подвесить" все приложение, т.е. пока один пользователь редактирует данные никто другой вообще не сможет вносить изменения. Только просмотр. При оптимистической буферизации - нет проблем начать вносить изменения, но есть проблемы в момент сохранения внесенных изменений. При буферизации таблиц - нет проблем с сохранением внесенных изменений, поскольку этот процесс полностью управляется программистом. При буферизации строк - есть проблемы с сохранением, поскольку в определенных ситуациях возможен автоматический сброс буфера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2004, 11:23 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Спасибо!, я не перестаю поражаться как Вы можете доходчиво объяснять на казалось бы надоевшие, неоднократно повторяющиеся по смыслу вопросы!!! Можно еще маленькие уточнения: 1) авторЗависит от того, как именно происходит редактирование - построчно (набор TextBox) или групами в Grid Я правильно понимаю, что если идет редактирование для набора TextBox-ов, то лучше использовать буфферизацию записей, а если Grid - то табличную буфферизацию? 2)Пессимистическая буфферизация - это одно и тоже что если бы я на, допустим, нажатие кнопки формы "Редактировать" вставил RLOCK() [LOCK()], т.е. при этой буфферизации происходит блокировка записи(таблицы)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2004, 11:51 |
|
||
|
Помогите с вопросом по блокировкам!!!
|
|||
|---|---|---|---|
|
#18+
Я правильно понимаю, что если идет редактирование для набора TextBox-ов, то лучше использовать буфферизацию записей, а если Grid - то табличную буфферизацию? Повторюсь. Это зависит от постановки задачи. Если же говорить абстрактно, т.е. в некотором "общем случае", то да. Если за раз редактируется только одна строка, то логично использовать строковую буферизацию. Если же допустимо групповое редактирование нескольких строк "одновременно" или же в процессе редактирования одной строки необходимо перемещаться по таблице (поиск), то - табличную буферизацию 2)Пессимистическая буфферизация - это одно и тоже что если бы я на, допустим, нажатие кнопки формы "Редактировать" вставил RLOCK() [LOCK()], т.е. при этой буфферизации происходит блокировка записи(таблицы)? Да. Только если давая команды RLOCK() явно Вы можете проконтролировать факт их выполнения, то при пессимистической буферизации придется отлавливать сообщение об ошибке (ON ERROR или Form.Error()) Оптимистическая буферизация делает попытку заблокировать запись только в момент сброса буфера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2004, 12:04 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32518319&tid=1596512]: |
0ms |
get settings: |
8ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 433ms |

| 0 / 0 |
