|
|
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
Первый раз пишу программу под сеть, и вот возник вопрос как обрабатывать ситуацию когда два пользователя работают с одной таблицей и например один из них удалил запись, как отследить этот момент и обновить данные на форме у другого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 12:01:01 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
Тема обширная и неоднократно обсуждаемая. Идем и ищим. А также читаем про блокивоки и команды и функции RLock()/Lock(), FLock(), UNLOCK, Delete() Или про буфферизацию и функции CURSORSETPROP(), TableUpdate(), TableRevert(), OldVal(), CurVal() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 12:54:32 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
Если вкратце: Ставим на табличку 5-й тип буферизации (оптимистическая табличная. Оптимистическая чтобы другим не мешать, табличная так как более управляемая) Редактируем запись. Проверяем не удалена ли запись - Deleted(). Если удалена сообщаем пользователю откатываем изменения. Проверяем не редактировал ли ее другой юзер (функция CurVal()). Если редактировал - выдаем сообщение и решаем что делать - либо прекратить редактировать - тогда откатываем все изменения функцией TableRevert(), либо перекрываем своими - делаем сброс буфера TableUpdate(). Если никто запись не менял то просто сбрасываем буфер. Если TableUpdate вернул .f., откатываем изменения обратно и выдаем пользователю причину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 13:32:39 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
А можно ли без уведомления пользователя о том, что запись удалена. Например через таймер делать Requery()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 13:50:25 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
И как сильно это загрузит сеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 13:50:47 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
>А можно ли без уведомления пользователя о том, что запись удалена Можно все, педложена просто схема. Я обычно на удаление не проверяю - успешный TableUpdate() в удаленую запись просто обновит твой буфер и удаленая строка пропадет. И при изменении другим пользователем тоже можно ничего не спрашивать - просто перекрывать своей инфой и все - кто последний тот и прав. Тут надо смотреть как надо пользователям. >Например через таймер делать Requery()? В случае буфферизации делать Requery() не надо - буфер автоматически обновляется по TableUpdate() и TableRevert(). В общем случае наверно можно, но я не встречал задачи в которой ситуация пока один юзер корректирует запись другой ее удалил встречалась бы часто. Requery() надо делать при третьем стиле работы - всю рабочую информацию мы редактируем через представления. Тут конечно можно и по таймеру обновлять, но после многочисленых баталий выбор большинства сделать специальную кнопку и обновлять по ее нажати. >И как сильно это загрузит сеть? Зависит от оптимизации представлений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 15:16:42 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
Вопрос наверное глупый, но все таки, возможно ли создавать представления для таблиц не входящих в БД (свободных)? Просто в данный момент весь интерфейс построен на фильтрах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 15:29:31 |
|
||
|
Работа в сети
|
|||
|---|---|---|---|
|
#18+
Укажи в качестве источника представления свободную таблицу. Для хранения самого представления тебе конечно потребуется контейнер DBC, а для источника нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 20:52:20 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33160921&tid=1593879]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
169ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 432ms |

| 0 / 0 |
